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 教程部分,了解更多信息和工作示例。