2016-04-25 10 views
0

Mein Code ist im Grunde über einen Rahmen und es hat eine Schaltfläche. Sie drücken die Taste, die Sie Rechtecke zeichnen können, erhalten Koordinaten von der Maus drücken und die Maustaste loslassen.JFrame fügt keine Komponente hinzu, wenn JButton gedrückt wird

Jetzt, wenn Sie die Schaltfläche entfernen funktioniert der Code perfekt, hier ist der Code.

// Testdatei

package ActionTest;  
import java.awt.*; 
import javax.swing.*;  

public class MouseTest 
{ 
    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       JFrame frame = new MouseFrame(); 
       frame.setTitle("MouseTest"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
       frame.setSize(500,500); 
      } 
     }); 
    } 
} 

Mein Rahmen, auf der Maus Komponente aufruft

package ActionTest; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class MouseFrame extends JFrame 
{   
    public MouseFrame() 
    {  
     add(new MouseComponent());     
    } 
} 

Die Komponentenklasse: Griffe Mausklicks und Ziehen des Rechteck

package ActionTest; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.util.*; 
import javax.swing.*; 
public class MouseComponent extends JComponent 
{  
    Point first; 
    Point second; 
    private ArrayList<Rectangle2D> rectangles; 

    public MouseComponent() 
    { 
     rectangles = new ArrayList<>();//contains rectangles 
     addMouseListener(new MouseHandler()); 
    } 
    //paint method of the component, simply re-paint the array 
    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 
     for (Rectangle2D r : rectangles) 
     g2.draw(r); 
    } 


    /** 
    * creates a rectangle and adds it to the rectangles ArrayList 
    * then repaint the component 
    * inside some operations to deal with rectangle drawing nothing to do with the issue 
    * @param p1: first coordinates 
    * @param p2: second coordinates 
    */ 
    public void addRec(Point2D p1, Point2D p2) 
    { 
     double w, h, x, y; 
     double x1 = p1.getX(); 
     double y1 = p1.getY(); 
     double x2 = p2.getX(); 
     double y2 = p2.getY(); 
     if(x1 <= x2){ 
      x = x1; 
      w = x2-x1;   
     } 
     else{ 
      x = x2; 
      w = x1-x2;   
     } 
     if (y1 <= y2){ 
      y = y1; 
      h = y2-y1;   
     } 
     else{ 
      y = y2; 
      h = y1-y2;   
     } 
     rectangles.add(new Rectangle2D.Double(x, y, w, h)); 
     repaint(); 
    } 


    //records mouse click and mose release 
    //you press the mouse that is the 1st coordinates 
    //you release it that is the 2nd coordinates 
    //pass both to the addRec method 
    private class MouseHandler extends MouseAdapter 
    { 
     @Override 
     public void mousePressed(MouseEvent event) 
     {   
      first = event.getPoint(); 
     } 
     @Override 
     public void mouseReleased(MouseEvent event) 
     { 
      second = event.getPoint();   
      addRec(first, second); 
     } 
    } 
} 

Es funktioniert perfekt. Zurück zum ursprünglichen Problem, wenn ich eine Schaltfläche hinzufügen, und wenn die Schaltfläche gedrückt wird, gehen Sie weiter und beginnen, Rechtecke zu zeichnen, funktioniert es nicht.

Hier ist die modifizierte Rahmenklasse

package ActionTest; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class MouseFrame extends JFrame 
{  
    private JPanel buttonPanel; 
    public MouseFrame() 
    {  

     JFrame frame = this; 
     buttonPanel = new JPanel(); 
     JButton rec = new JButton("Rectangle"); 
     rec.addActionListener(new ActionListener(){   
      public void actionPerformed(ActionEvent event) 
      {   
       System.out.println("pressed");     
       frame.add(new MouseComponent());     
      }}); 
     buttonPanel.add(rec); 
     add(buttonPanel);    
    } 
} 

Vielen Dank im Voraus.

Antwort

2
frame.add(new MouseComponent()); 

Die Größe einer neu erstellten Komponente ist (0, 0), also gibt es nichts zu malen. Daher müssen Sie den Layout-Manager aufrufen, wenn Sie einer sichtbaren GUI eine Komponente hinzufügen.

frame.add(new MouseComponent()); 
frame.revalidate(); 
frame.repaint(); 

Beachten Sie, dass dies nur funktioniert, wenn Sie mit dem Layout-Manager mehrere Komponenten zum Rahmen hinzufügen können. Der Standard-Layout-Manager für einen Frame ist BorderLayout und es können nur einzelne Komponenten zum CENTER des BorderLayout hinzugefügt werden.

Vielleicht müssen Sie die Schaltfläche hinzufügen mit:

frame.add(button, BorderLayout.PAGE_START); 

den Ausschnitt aus der Swing-Tutorial Machen Sie How to Use Layout Managers für weitere Informationen und Arbeitsbeispiele.

Auch jedes Mal, wenn Sie benutzerdefinierte Malerei tun müssen Sie die getPreferredSize() Methode der benutzerdefinierten Komponente überschreiben, damit die Layout-Manager ihre Arbeit machen können.

+0

Es hat nicht funktioniert. –

+0

@ThyGamosh, lesen Sie das Tutorial zum Layout-Manager. Sie müssen wahrscheinlich den Layout-Manager ändern. Lesen Sie auch meinen Kommentar zu 'getPreferredSize()'. – camickr

+0

Ich werde es überprüfen, thx. –

Verwandte Themen