Namensraum | Vererbungshierarchie | Schnittstellen |
javax.swing | java.lang.Object java.awt.Component java.awt.Container JComponent javax.swing.JPanel |
Accessible ImageObserver MenuContainer Serializable |
Kurzbeschreibung |
JComponent ist eine abstrakte Klasse und Basisklasse fast aller visuellen Komponenten von Swing. JComponent ist eine geeignete Basisklasse für die Implementierung spezialisierter visueller Komponenten. |
Java SE 6 | http://docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html |
Java SE 7 | http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html |
Mit der Methode setBackground kann die Hintergrundfarbe eines Panels festgelegt. JComponent verwendet diese Hintergrundfarbe aber nicht! Wenn die Berücksichtigung der Hintergrundfarbe gewünscht ist, sollte statt JComponent die Klasse JPanel verwendet werden.
Um in ein Panel zu zeichnen, definieren abgeleitete Klassen die Methode paintComponent neu. Die erste Anweisung der neu definierten Methode sollte der Aufruf von paintComponent in der Basisklasse sein. Dieser Aufruf stellt sicher, dass der Hintergrund des Panels richtig gezeichnet wird.
Der Inhaltsbereich eines Panels wird mit repaint() zur Auffrischung vorgemerkt.
Um die Bewegungen der Maus zu erfahren, ist ein MouseMotionListener bereitzustellen. Dieser Listener wird mit der Methode addMouseMotionListener installiert.
Um die Aktivitäten der Maus zu erfahren, ist ein MouseListener bereitzustellen. Dieser Listener wird mit addMouseListener installiert.
Um sowohl Mauserereignisse als auch Mausbewegungen zu erfahren, kann auch ein MouseInputListener bereitgestellt werden. Ein solcher Listener ist mit den Methoden addMouseListener und addMouseMotionListener doppelt zu installieren.
Die Unterscheidung zwischen Mausereignissen und Mausbewegungen mag als unnötige Komplizierung angesehen werden, sie hat aber einen guten Grund: Viele von JComponent abgeleitete Darstellungselemente (z.B. Taster und Schalter) benötigen lediglich die Mausereignisse. Mausbewegungen werden verhältnismäßig selten benötigt (z.B. in Malprogrammen); ihre Beobachtung verursacht außerdem eine hohe Belastung des Rechners. Es ist also sinnvoll, sich in Fällen, in denen die Mausbewegungen nicht benötigt werden, auf die Beobachtung der Mausereignisse zu beschränken.
Vorlage für paintComponent, falls das Panel keinen Rand verwendet.
@Override public void paintComponent(java.awt.Graphics arg) { super.paintComponent(arg); java.awt.Dimension groesse = this.getSize(); java.awt.Rectangle bereich = new java.awt.Rectangle(groesse); java.awt.Graphics2D g = (java.awt.Graphics2D) arg; this.InhaltZeichnen(g, bereich); }
Vorlage für paintComponent, falls das Panel einen Rand verwendet.
@Override public void paintComponent(java.awt.Graphics arg) { super.paintComponent(arg); java.awt.Dimension groesse = this.getSize(); java.awt.Insets insets = this.getInsets(); java.awt.Rectangle bereich = new java.awt.Rectangle(insets.left, insets.top, groesse.width - (insets.left + insets.right), groesse.height - (insets.top + insets.bottom)); java.awt.Graphics2D g = (java.awt.Graphics2D) arg; this.InhaltZeichnen(g, bereich); }
Wenn das Panel mit einem Rand ausgestattet wurde, darf die Strichbreite des Zeicheninstruments in paintComponent nicht verändert werden. Die folgende Vorlage sollte in dieser Situation verwendet werden:
@Override public void paintComponent(Graphics arg) { super.paintComponent(arg); java.awt.Dimension groesse = this.getSize(); java.awt.Insets insets = this.getInsets(); java.awt.Rectangle bereich = new java.awt.Rectangle(insets.left, insets.top, groesse.width - (insets.left + insets.right), groesse.height - (insets.top + insets.bottom)); java.awt.Graphics2D g = (java.awt.Graphics2D) arg; java.awt.Stroke st = g.getStroke(); // Strichbreite speichern this.InhaltZeichnen(g, bereich); g.setStroke(st); // frühere Strichbreite wiederherstellen }