Ich hatte gehofft, dass mir jemand dabei helfen könnte. Ich kann wirklich niemanden finden, der genau dieses Problem beschreibt. In meiner Hauptklasse (Window
), die JFrame
erweitert, füge ich ein Objekt einer Klasse (Panel
) hinzu, das JPanel
erweitert und es meinem Rahmen hinzufügt.Artikel zu JPanel hinzugefügt, die nicht angezeigt werden
So weit so gut, alles in der JPanel
Klasse zeigt mich, wie sie sollten, aber wenn ich in meiner Hauptklasse ShapeDef
Objekt erstellen (verwendete Zahlen zu definieren und ziehen), und dann versuchen, es zu den Panel
hinzuzufügen, die Zahlen werden nicht angezeigt. Warum? Ich versuchte mit revalidate()
und repaint
, aber es scheint nicht zu funktionieren.
Hier ist ein Teil des Codes:
Main-Klasse:
public class Window extends JFrame implements ActionListener{
private JPanel myPanel;
private ShapeDef rect1, rect2;
public Window(){
super("Test Window");
setLayout(new BorderLayout());
myPanel = new Panel(new BorderLayout());
myPanel.setBackground(Color.BLACK);
rect1 = new ShapeDef("Rectangle", Color.green, 200, 300, 20, 80);
rect2 = new ShapeDef("Rectangle", Color.BLUE, 300, 700, 50, 40);
myPanel.add(rect1);
myPanel.add(rect2);
add(myPanel, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame myFrame = new PongInvaders();
myFrame.setSize(1280, 720);
myFrame.setBackground(Color.BLACK);
myFrame.pack();
myFrame.setVisible(true);
}
});
}
ShapeDef Klasse:
public class ShapeDef extends JComponent{
private final Color color;
private final int x, y, width, height;
private final String type;
public ShapeDef(String type, Color color, int x, int y, int width, int height){
this.type = type;
this.color = color;
setBounds(x, y, width, height);
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
if(type.equalsIgnoreCase("Rectangle")){
g.setColor(color);
g.fillRect(0, 0, width, height);
}
else if(type.equalsIgnoreCase("Oval")){
g.setColor(color);
g.fillOval(x, y, width, height);
}
}
}
Die aktuelle Version des von Keqiang Li vorgeschlagen Code zeichnet sowohl die Rechtecke , aber rect2 erscheint bei (0,0), während rect1 an den richtigen Koordinaten spawnt. Also im Grunde ist die Frage beantwortet, also vielen Dank für Ihre Hilfe. Aber warum spawnt nur eines der Rechtecke bei (0,0), während das andere bei gesetzten Koordinaten spawnt, wenn beide zum selben JPanel hinzugefügt werden?
@MadProgrammer Obwohl Ihre Antwort war nicht die, die ich erwartet habe, ich denke, es ist derjenige, den ich brauchte. Sie werden Ihrem Benutzernamen definitiv gerecht. Vielen Dank, dass Sie sich die Zeit genommen haben, mir etwas mehr über das Erstellen einer besseren Code-Struktur beizubringen.
Ich möchte auch darauf hinweisen, dass die anderen Antworten sehr hilfreich und aufschlussreich waren und dass sie mir auch viel beibrachten.
fähig war Warum hat die Klasse "Panel" eine Constructor-Methode namens "RandomShape"? Und du willst wirklich Dinge für JPanel zeichnen, indem du die Methode "paintComponent" überschreibst? Es sieht besser aus, wenn Sie nur Etiketten oder andere Komponenten in einem 'JPanel' hinzufügen –
Die andere Sache ist, es ist wirklich keine gute Übung, Ihre benutzerdefinierte Klasse die gleiche wie Java-Bibliothek Klasse, wie zum Beispiel" Panel "," Window " , füge dein eigenes Präfix hinzu. –
Er zeichnet ausgefüllte Formen in der paintComponent-Methode. – FredK