2017-07-28 73 views
0

我必须在绘制的圆上绘制带有onclick事件的JLabel。应该将新创建的JLabel放置在非常封闭的已经创建的一条线上。我试图在这条线的中间位置绘制这个JLabel。但问题是,即使设置了固定的计算坐标(x,y),JLabel也不会绘制在给定的位置(与g.drawLine()或g.drawOval()不同)。我的代码如下:需要帮助来解决它。java swing'JLabel'和图形元素的位置(x,y)不一样

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(); 
    } 

} 
+0

油漆方法可以每秒调用多次。不要在绘画方法中创建新的JLabel,也不要在绘画方法中添加组件。如果您需要显示JLabel,则在构建组件树时将其添加*一次*。 – VGR

+0

对,我遇到了这个问题。非常感谢:) –

回答

0

不要覆盖JFrame上的paint()!

该框架包含标题栏和边框,因此您不能仅在(0,0)处绘制。你会需要你的绘画被框架装饰抵消。

取而代之,自定义绘画应通过覆盖JPanel的paintComponent(...)方法完成,然后将面板添加到框架。现在偏移将相对于面板,所以您可以使用(0,0)。当然,你也可以在你想要的位置添加标签到面板上。

阅读Swing教程中有关Custom Painting的部分以获取更多信息和工作示例。

+0

谢谢,它与paintComponent()一起使用。 –

0

更改代码

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; 

和您的矩形(左上角)将被放置在该行的中间位置(你还可以设置一个偏移如果它太接近:-))

+0

仍然是一样的。但问题是:如果我用这个位置绘制了一个带有g.drawOval()的圆,那么这个圆就是绘制在这条线上的。我试图在(0,0)处画一个矩形,但是这个矩形没有画在左上角。当我在(0,0)位置绘制JLabel时,它将绘制在窗口的左上角。任何想法为什么是这样? –