Java - zeichne einen Kreis nach dem Klick auf die Schaltfläche
Ich versuche einen Kreis zu zeichnen mit dem drücken einer Taste in java. Ich habe das System.aus.println() in der action-Methode, um sicherzustellen, dass mein code funktioniert. Die println zeigt sich aber keinen Kreis zeichnen an einer beliebigen Stelle. Irgendwelche Vorschläge? Danke
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class CircleViewer {
public static void main(String[] args)
{
CircleComponent circle = new CircleComponent();
JButton button = new JButton("Draw");
final JPanel panel = new JPanel();
panel.add(button);
JFrame frame = new JFrame();
class addActionListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
CircleComponent component = new CircleComponent();
String x = JOptionPane.showInputDialog("X Coordinate", "Enter an x coordinate");
int xCoord = Integer.parseInt(x);
String y = JOptionPane.showInputDialog("Y Coordinate", "Enter a y coordinate");
int yCoord = Integer.parseInt(y);
String width = JOptionPane.showInputDialog("Radius", "Enter the length of the radius");
int radius = Integer.parseInt(width);
component.setLocation(xCoord,yCoord);
component.getWidth(radius);
panel.add(component);
System.out.println("CLICKED!");
}
}
frame.add(panel);
ActionListener action = new addActionListener();
button.addActionListener(action);
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
/**
This component lets the user draw a circle by clicking
a button.
*/
public class CircleComponent extends JPanel
{
private int x;
private int y;
private int width;
Ellipse2D.Double circle;
public CircleComponent()
{
circle = new Ellipse2D.Double(x, y, width, width);
}
public Dimension getPreferredSize()
{
return new Dimension(500,500);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.draw(circle);
}
public int getWidth(int aWidth)
{
width = aWidth;
return width;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie das überschreiben der
getPreferredSize()
Methode, wenn Sie die benutzerdefinierte Komponente. Standardmäßig wird die Größe (0, 0), so gibt es nichts zu malen.Dem revalidate() getan werden sollte auf das panel, nicht die Komponente.
Ihre getX() und getY () - Methoden keinen Sinn machen. Wenn Sie möchten, platzieren Sie die Komponente auf der Platte, die Sie sollten mit den setLocation (...) - Methode der Komponente.
Edit:
Gibt es noch viele probolems. Ich werde versuchen, Ihnen zu erklären, und dann geben Sie eine bessere (noch nicht groß) Beispiel, wie Sie dies tun können.
Beim erstellen der Form des Kreises alle Parameter haben einen Wert von 0, so gibt es nichts zu malen. Sie können nicht ändern Sie einfach die Werte der Variablen x, y und die Breite später, und erwarten, dass der Kreis zu reflektieren diese Werte.
Die Größe der Komponente ist falsch. Man kann nicht einfach eine beliebige Größe von 500 x 500. Die bevorzugte Größe sollte die Größe des Kreises.
Kann man nicht einfach fügen Sie die Komponente auf das panel, da das panel verwendet einen FlowLayout standardmäßig. Dies bedeutet, dass die setLocation () - Methode wird ignoriert. Ich änderte den code verwenden Sie ein null-layout. Dies bedeutet, dass der Speicherort, den Sie angeben, wird jetzt verwendet werden, und Sie müssen auch angeben, die Größe der Komponente.
Änderte ich den code verwenden, eine "anonyme innere Klasse" für die ActonListener. Dies ist häufiger dann der Definition einer Klasse in der Mitte der anderen Klasse.
Ist hier die quick Beispiel:
I want the user to be able to pick where they want to put the circle
das ist, warum Sie verwenden diesetLocation(...)
Methode mit den Werten, die vom Benutzer eingegeben werden. Die bevorzugte Größe der Komponente ist die Größe des Kreises. So müssen Sie zum überschreiben die getPreferredSize () - Methode der Komponente, um wieder eine Dimension-Objekt mit der richtigen Größe. Lesen Sie den Abschnitt, aus dem Swing-tutorial auf Custom Painting für ein einfaches Beispiel, das dies tut.