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.
Es hat nicht funktioniert. –
@ThyGamosh, lesen Sie das Tutorial zum Layout-Manager. Sie müssen wahrscheinlich den Layout-Manager ändern. Lesen Sie auch meinen Kommentar zu 'getPreferredSize()'. – camickr
Ich werde es überprüfen, thx. –