2017-07-28 5 views
0

Ich muss ein JLabel mit einem onclick-Ereignis auf einem gezeichneten Kreis zeichnen. Das neu erstellte JLabel sollte sehr geschlossen platziert werden, eine Linie, die bereits erstellt wurde. Ich habe versucht, dieses JLabel in der Mitte der Linie zu zeichnen. Das Problem ist jedoch, dass selbst nach dem Setzen fest berechneter Koordinaten (x, y) das JLabel nicht an der angegebenen Stelle gezeichnet wird (im Gegensatz zu g.drawLine() oder g.drawOval()). Mein Code ist unten angegeben: brauche Hilfe, um es zu beheben.der Standort (x, y) von Java Swing 'JLabel' und Grafikelemente sind nicht gleich

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

Malmethoden können mehrmals pro Sekunde aufgerufen werden. Erstellen Sie kein neues JLabel innerhalb einer Paint-Methode und fügen Sie keine Komponenten in einer Paint-Methode hinzu. Wenn Sie ein JLabel anzeigen müssen, fügen Sie es * einmal * hinzu, wenn Sie Ihren Komponentenbaum aufbauen. – VGR

+0

richtig, ich habe das Problem erlebt. vielen dank :) –

Antwort

0

Überschreiben Sie nicht paint() auf einem JFrame!

Der Rahmen enthält die Titelleiste und Rahmen, so dass Sie nicht nur bei (0, 0) malen können. Sie müssten Ihr Gemälde von den Rahmendekorationen absetzen.

Stattdessen sollte benutzerdefinierte Bemalung durch Überschreiben der paintComponent(...)-Methode eines JPanel durchgeführt werden, und dann fügen Sie das Panel zum Rahmen hinzu. Jetzt sind die Offsets relativ zum Panel, also können Sie (0, 0) verwenden. Natürlich würden Sie das Etikett auch an Ihrem gewünschten Ort in das Panel einfügen.

Lesen Sie den Abschnitt aus den Swing-Tutorial auf Custom Painting für weitere Informationen und Arbeitsbeispiele.

+0

danke, es funktioniert mit paintComponent(). –

0

Ändern Sie den Code

int lX = (int)Math.abs(endX-startX)/2; 
int lY = (int)Math.abs(endY-startY)/2; 

zu

int lX = (endX-startX)/2; 
int lY = (endY-startY)/2; 

und das Rechteck (obere Ecke links) in der mittleren Position der Linie platziert werden (man kann ein noch gesetzt Offset wenn es zu nah ist :-))

+0

immer noch das gleiche. aber das Problem ist: Wenn ich einen Kreis mit g.drawOval() mit dieser Position zeichne, wird der Kreis auf der Linie gezeichnet. Ich habe versucht, ein Rechteck um (0,0) zu zeichnen, aber dieses Rechteck wird nicht in der oberen linken Ecke gezeichnet. Wenn ich JLabel an der Position (0,0) zeichne, wird es in der oberen linken Ecke des Fensters gezeichnet. irgendeine Idee warum ist das? –

Verwandte Themen