java swing 'JLabel' 的 location(x,y) 和 Graphics 元素不一样
the location(x,y) of java swing 'JLabel' and Graphics elements are not same
我必须在绘制的圆上绘制一个带有 onclick 事件的 JLabel。新创建的 JLabel 应该放置在非常靠近已经创建的行的位置。我试图在该行的中间位置绘制此 JLabel。但问题是,即使在设置固定计算坐标 (x,y) 之后,JLabel 也不会绘制在给定位置。(与 g.drawLine() 或 g.drawOval() 不同)。我的代码如下:需要帮助来修复它。
public class ButtonExample extends JFrame{
JFrame frame;
JLabel label1, label2, label3;
private Shape myShape;
private int arrowAdded = 0;
public ButtonExample() {
super("Location test of JLabel and Graphics objects");
label1 = new JLabel("0,0");
//label2 = new JLabel("40,40");
label1.setBounds(0, 0, 50, 50);
label1.setBorder(BorderFactory.createLineBorder(Color.black));
//label2.setBounds(100, 100, 50, 50);
//label2.setBorder(BorderFactory.createLineBorder(Color.black));
add(label1);
//add(label2);
repaint();
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
super.mouseClicked(me);
if (myShape.contains(me.getPoint())) {
arrowAdded = 1;
repaint();
}
}
});
setLayout(null);
setSize(1000,600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(1000, 600);
}
public void paint(Graphics g){
super.paint(g);
int startX = 100;
int startY = 100;
int endX = 180;
int endY = 120;
g.setColor(new Color(0, 255, 0));
myShape = new Ellipse2D.Double(startX, startY, 30, 30);
Graphics2D g2d = (Graphics2D) g;
g2d.draw(myShape);
g.drawLine(startX, startY, endX, endY);
int lX = (int)Math.abs(endX-startX)/2;
int lY = (int)Math.abs(endY-startY)/2;
if(endX>startX) {
lX = lX+startX;
}else {
lX = lX+endX;
}
if(endY>startY) {
lY = lY+startY;
}else {
lY = lY+endY;
}
if(arrowAdded == 1) {
label3 = new JLabel();
label3.setBounds(lX, lY, 20, 15);
label3.setBorder(BorderFactory.createLineBorder(Color.black));
add(label3);
g.drawRect(lX, lY, 20, 15);
}enter code here
}
public static void main(String[] args) {
new ButtonExample();
}
}
更改您的代码
int lX = (int)Math.abs(endX-startX) / 2;
int lY = (int)Math.abs(endY-startY) / 2;
到
int lX = (endX-startX) / 2;
int lY = (endY-startY) / 2;
你的矩形(左上角)将被放置在直线的中间位置(如果距离太近,你仍然可以设置一个偏移量:-))
不要覆盖 JFrame 上的 paint()!
框架包括标题栏和边框,因此您不能只在 (0, 0) 处绘画。你需要你的画被框架装饰所抵消。
相反,自定义绘画应该通过覆盖 JPanel 的 paintComponent(...)
方法来完成,然后将面板添加到框架中。现在偏移量将相对于面板,因此您可以使用 (0, 0)。当然,您也可以将标签添加到面板中您想要的位置。
阅读有关 Custom Painting 的 Swing 教程部分,了解更多信息和工作示例。
我必须在绘制的圆上绘制一个带有 onclick 事件的 JLabel。新创建的 JLabel 应该放置在非常靠近已经创建的行的位置。我试图在该行的中间位置绘制此 JLabel。但问题是,即使在设置固定计算坐标 (x,y) 之后,JLabel 也不会绘制在给定位置。(与 g.drawLine() 或 g.drawOval() 不同)。我的代码如下:需要帮助来修复它。
public class ButtonExample extends JFrame{
JFrame frame;
JLabel label1, label2, label3;
private Shape myShape;
private int arrowAdded = 0;
public ButtonExample() {
super("Location test of JLabel and Graphics objects");
label1 = new JLabel("0,0");
//label2 = new JLabel("40,40");
label1.setBounds(0, 0, 50, 50);
label1.setBorder(BorderFactory.createLineBorder(Color.black));
//label2.setBounds(100, 100, 50, 50);
//label2.setBorder(BorderFactory.createLineBorder(Color.black));
add(label1);
//add(label2);
repaint();
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
super.mouseClicked(me);
if (myShape.contains(me.getPoint())) {
arrowAdded = 1;
repaint();
}
}
});
setLayout(null);
setSize(1000,600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(1000, 600);
}
public void paint(Graphics g){
super.paint(g);
int startX = 100;
int startY = 100;
int endX = 180;
int endY = 120;
g.setColor(new Color(0, 255, 0));
myShape = new Ellipse2D.Double(startX, startY, 30, 30);
Graphics2D g2d = (Graphics2D) g;
g2d.draw(myShape);
g.drawLine(startX, startY, endX, endY);
int lX = (int)Math.abs(endX-startX)/2;
int lY = (int)Math.abs(endY-startY)/2;
if(endX>startX) {
lX = lX+startX;
}else {
lX = lX+endX;
}
if(endY>startY) {
lY = lY+startY;
}else {
lY = lY+endY;
}
if(arrowAdded == 1) {
label3 = new JLabel();
label3.setBounds(lX, lY, 20, 15);
label3.setBorder(BorderFactory.createLineBorder(Color.black));
add(label3);
g.drawRect(lX, lY, 20, 15);
}enter code here
}
public static void main(String[] args) {
new ButtonExample();
}
}
更改您的代码
int lX = (int)Math.abs(endX-startX) / 2;
int lY = (int)Math.abs(endY-startY) / 2;
到
int lX = (endX-startX) / 2;
int lY = (endY-startY) / 2;
你的矩形(左上角)将被放置在直线的中间位置(如果距离太近,你仍然可以设置一个偏移量:-))
不要覆盖 JFrame 上的 paint()!
框架包括标题栏和边框,因此您不能只在 (0, 0) 处绘画。你需要你的画被框架装饰所抵消。
相反,自定义绘画应该通过覆盖 JPanel 的 paintComponent(...)
方法来完成,然后将面板添加到框架中。现在偏移量将相对于面板,因此您可以使用 (0, 0)。当然,您也可以将标签添加到面板中您想要的位置。
阅读有关 Custom Painting 的 Swing 教程部分,了解更多信息和工作示例。