Ich bin neu in Java und habe erst angefangen, GUI-Komponenten zu lernen. So las ich Headfirst Java und es gibt diesen Code, der paintcomponent
Methode von JPanel
erklärt. Es ist nur die Farbe des Ovals zu ändern, wenn der Benutzer auf die Schaltfläche "Farben ändern" klickt. -repaint() -Methode in JFrame oder Jpanel?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleGui3C implements ActionListener {
JFrame frame;
public static void main(String[] args) {
SimpleGui3C gui = new SimpleGui3C();
gui.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("Change colors");
button.addActionListener(this);
MyDrawPanel drawPanel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH, button);
frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
frame.setSize(500,500);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
frame.repaint();
}
}
MyDrawPanel Klasse -
import javax.swing.*;
import java.awt.*;
class MyDrawPanel extends JPanel {
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
// GradientPaint gradient = new GradientPaint(70,70,Color.blue,150,150,Color.orange);
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color startColor = new Color(red, green, blue);
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
Color endColor = new Color(red, green, blue);
GradientPaint gradient = new GradientPaint(70,70,startColor,150,150,endColor);
g2d.setPaint(gradient);
g2d.fillOval(70,70,100,100);
}
}
Ich habe alles aus diesem Beispiel mit Ausnahme des Teils, wo wir repaint()
Methode aufrufen.
In dem Buch wurde erwähnt, dass nur die paintcomponent
Methode von JPanel
außer Kraft setzen und wenn Sie repaint()
nennen, wird es paintcomponent
den Inhalt zu machen nennen (da sie nicht direkt paintcomponent
nennen).
Jetzt habe ich MyDrawPanel
Klasse erstellt, indem Sie JPanel
erweitern und seine paintComponent
Methode überschreiben. Wenn wir jetzt drawPanel
Widget auf Frame und dann auf Mausklick setzen, wird repint()
Methode aufgerufen. Aber diese repaint()
Methode wird mit frame
- ein Objekt von JFrame
aufgerufen. Laut meinem grundlegenden Java-Verständnis muss diese Methode, wenn ich eine Methode unter Verwendung eines Objekts aufrufe, in dieser Klasse oder in irgendeiner Super-Klasse sein. Ich sehe nicht, wie das Rufen repaint()
auf frame
Farbkomponente von MyDrawPanel
auslösen wird. Ich habe einige graben, um zu sehen, ob JFrame
und JPanel
Aktien die gleiche Hierarchie und hier ist das, was ich gefunden habe:
object
-> component
(hat Methode neu streichen) -> container
(hat paintcomponent-Methode) ->
`jcomponent` --> `jpanel`
`window` --> `frame` --> `jframe`
So dachte ich, dass beide seit JFrame
und JPanel
paintComponent
und repaint
Methoden bekommen, kann ich Jframe
erweitern können MyDrawPanel
zu schaffen statt Jpanel
und es sollte gut funktionieren. Aber das tut es nicht. Es kompiliert fein, aber Laufzeitausnahme.
Es ist wirklich frustrierend. Vielleicht bekomme ich keine GUI-Konzepte oder meine Grundlagen sind immer noch schwach. Bitte lassen Sie mich wissen, wenn ich hier etwas wirklich Dummes verpasse.
Können Sie die Ausnahme Sie hinzufügen bekommen? – APerson