2017-07-28 75 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時,它將繪製在窗口的左上角。任何想法爲什麼是這樣? –