在 JLabel 中设置位置
SetLocation in JLabel
我的任务是在单击时获取鼠标的位置,除了一件事外,我几乎完成了:输出的位置。我应该在第一次点击时得到这个,但只有双击才能得到正确的输出:
无论位置如何,第一次点击时我得到的结果如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Mouse {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JLabel label = new JLabel();
frame.add(panel);
panel.add(label);
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
label.setLocation(x,y);
label.setText("(" + x + "," + y + ")");
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
JPanel
,但默认使用的是 LayoutManager
,通常我会劝阻您不要尝试使用它,但在您的情况下,您可能别无选择。
通常情况下,我会考虑编写一个布局管理器来处理这个问题,但这超出了要求的范围。
相反,首先将 panel
的布局管理器设置为 null
JFrame frame = new JFrame();
JPanel panel = new JPanel(null);
现在你已经完成了,你将完全负责组件的管理,关于它的大小和位置,所以,当调用 mouseClicked
时,你需要设置 text
, location
AND size
的标签,例如。
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
label.setLocation(x,y);
label.setText("(" + x + "," + y + ")");
label.setSize(label.getPreferredSize());
}
});
仔细查看 Laying Out Components Within a Container,了解有关布局管理器 API 功能及其工作原理的更多详细信息
选项 2 是在 JPanel 的 paintComponent 方法中显示文本。这样您就不必担心使用可怕的 null 布局管理器。例如:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class MousePosition extends JPanel {
private static final int PREF_W = 600;
private static final int PREF_H = PREF_W;
// format String for display String
protected static final String FORMAT = "(%d, %d)";
private int xPos = -40;
private int yPos = -40;
private String displayText = "";
public MousePosition() {
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
xPos = e.getX();
yPos = e.getY();
// use FORMAT String to create our display text
displayText = String.format(FORMAT, xPos, yPos);
repaint();
}
});
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(displayText, xPos, yPos);
}
private static void createAndShowGui() {
MousePosition mainPanel = new MousePosition();
JFrame frame = new JFrame("MousePosition");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
我的任务是在单击时获取鼠标的位置,除了一件事外,我几乎完成了:输出的位置。我应该在第一次点击时得到这个,但只有双击才能得到正确的输出:
无论位置如何,第一次点击时我得到的结果如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Mouse {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JLabel label = new JLabel();
frame.add(panel);
panel.add(label);
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
label.setLocation(x,y);
label.setText("(" + x + "," + y + ")");
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
JPanel
,但默认使用的是 LayoutManager
,通常我会劝阻您不要尝试使用它,但在您的情况下,您可能别无选择。
通常情况下,我会考虑编写一个布局管理器来处理这个问题,但这超出了要求的范围。
相反,首先将 panel
的布局管理器设置为 null
JFrame frame = new JFrame();
JPanel panel = new JPanel(null);
现在你已经完成了,你将完全负责组件的管理,关于它的大小和位置,所以,当调用 mouseClicked
时,你需要设置 text
, location
AND size
的标签,例如。
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
label.setLocation(x,y);
label.setText("(" + x + "," + y + ")");
label.setSize(label.getPreferredSize());
}
});
仔细查看 Laying Out Components Within a Container,了解有关布局管理器 API 功能及其工作原理的更多详细信息
选项 2 是在 JPanel 的 paintComponent 方法中显示文本。这样您就不必担心使用可怕的 null 布局管理器。例如:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class MousePosition extends JPanel {
private static final int PREF_W = 600;
private static final int PREF_H = PREF_W;
// format String for display String
protected static final String FORMAT = "(%d, %d)";
private int xPos = -40;
private int yPos = -40;
private String displayText = "";
public MousePosition() {
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
xPos = e.getX();
yPos = e.getY();
// use FORMAT String to create our display text
displayText = String.format(FORMAT, xPos, yPos);
repaint();
}
});
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(displayText, xPos, yPos);
}
private static void createAndShowGui() {
MousePosition mainPanel = new MousePosition();
JFrame frame = new JFrame("MousePosition");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}