2017-07-28 11 views
0

描画された円でonclickイベントを使用してJLabelを描画する必要があります。新しく作成されたJLabelは、既に作成された行を非常に閉じた状態に配置する必要があります。このJLabelを線の中央に描画しようとしていました。しかし問題は、固定された計算座標(x、y)を設定した後でも、JLabelは指定された場所に描画されません(g.drawLine()またはg.drawOval()とは異なります)。私のコードは以下のとおりです:それを修正するための助けが必要です。 (上隅を左)Javaスイング 'JLabel'とGraphics要素の位置(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を表示する必要がある場合は、コンポーネントツリーを構築するときに* once *を追加します。 – VGR

+0

私は問題を経験しました。おかげで多くの:) –

答えて

0

JFrameでpaint()をオーバーライドしないでください!

フレームにはタイトルバーと罫線が含まれているため、(0、0)にペイントすることはできません。あなたは絵画がフレーム装飾によって相殺される必要があります。

代わりに、JPanelのpaintComponent(...)メソッドをオーバーライドして、カスタムペイントを行い、フレームをパネルに追加する必要があります。オフセットはパネルに相対的なものになりますので、(0、0)を使用できます。もちろん、あなたの希望する場所のラベルをパネルに追加することもできます。

詳細と動作例については、Custom PaintingのSwingチュートリアルのセクションをお読みください。

+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)に矩形を描画しようとしましたが、この矩形は左上隅に描画されていません。 JLabelを(0,0)の位置に描画すると、ウィンドウの左上隅に描画されます。それは何である? –

関連する問題