Hallo allerseits,
habe ein Verständnisproblem mit repaint(), paintComponent(), usw.
Mein Problem: Was macht repaint alles?
Habe dazu folgendes recherchiert:
Aufrufreihenfolge von repaint() in Swing:
repaint() --> paint() --> paintComponent(..) --> paintBorder() --> paintChildren()
I) (Demo-Programm dazu befindet sich weiter unten. Es wurde mit dem Netbeans Visual Editor erstellt)
Angenommen repaint() wird in einer Subklasse von JFrame aufgerufen (SubJFrame genannt).
Das Fenster SubJFrame soll eine Zeichenfläche SubJPanel (eine Subklasse von JPanel) enthalten, ein paar Textfelder, Buttons usw.
(Im Demo-Programm enthält das Fenster der Einfachheit halber genau eine Zeichenfläche und genau ein Textfeld).
In einer Methode von SubJFrame soll nun repaint() aufgerufen werden.
Was passiert?
repaint() ruft intern paintComponent(..) auf.
Was macht paintComponent(..) ?
1) Zeichnet es nur die Zeichenfläche des Fensters (bzw. die Umrandung mit paintBorder())?
2) Was macht dann aber paintChildren() ? Siehe Aufrufreihenfolge oben.
3) Wer veranlasst, dass - nicht nur die Zeichenfläche - sondern auch die Textfelder (und der darin enthaltene Text), Buttons usw. neu gezeichnet werden?
Habe zu Testzwecken in SubJFrame kein repaint(() gemacht, aber den Inhalt eines Textfelds (mit einem Timer) und mit
setText(..) laufend ändern lassen. Trotzdem (obwohl kein repaint() gemacht wird) wird der Inhalt des Textfelds auf dem Bildschirm laufend verändert (aktualisiert). Warum wird das Textfeld ohne repaint verändert und warum braucht man - um das laufend verschobene Rechteck in den Zeichenfläche darzustellen- den Aufruf von repaint()?
Die Java-Doku hilft mir hier nicht weiter (bzw. damit kann ich diesbezüglich wenig anfangen).
mfg
Ernst
habe ein Verständnisproblem mit repaint(), paintComponent(), usw.
Mein Problem: Was macht repaint alles?
Habe dazu folgendes recherchiert:
Aufrufreihenfolge von repaint() in Swing:
repaint() --> paint() --> paintComponent(..) --> paintBorder() --> paintChildren()
I) (Demo-Programm dazu befindet sich weiter unten. Es wurde mit dem Netbeans Visual Editor erstellt)
Angenommen repaint() wird in einer Subklasse von JFrame aufgerufen (SubJFrame genannt).
Das Fenster SubJFrame soll eine Zeichenfläche SubJPanel (eine Subklasse von JPanel) enthalten, ein paar Textfelder, Buttons usw.
(Im Demo-Programm enthält das Fenster der Einfachheit halber genau eine Zeichenfläche und genau ein Textfeld).
In einer Methode von SubJFrame soll nun repaint() aufgerufen werden.
Was passiert?
repaint() ruft intern paintComponent(..) auf.
Was macht paintComponent(..) ?
1) Zeichnet es nur die Zeichenfläche des Fensters (bzw. die Umrandung mit paintBorder())?
2) Was macht dann aber paintChildren() ? Siehe Aufrufreihenfolge oben.
3) Wer veranlasst, dass - nicht nur die Zeichenfläche - sondern auch die Textfelder (und der darin enthaltene Text), Buttons usw. neu gezeichnet werden?
Habe zu Testzwecken in SubJFrame kein repaint(() gemacht, aber den Inhalt eines Textfelds (mit einem Timer) und mit
setText(..) laufend ändern lassen. Trotzdem (obwohl kein repaint() gemacht wird) wird der Inhalt des Textfelds auf dem Bildschirm laufend verändert (aktualisiert). Warum wird das Textfeld ohne repaint verändert und warum braucht man - um das laufend verschobene Rechteck in den Zeichenfläche darzustellen- den Aufruf von repaint()?
Die Java-Doku hilft mir hier nicht weiter (bzw. damit kann ich diesbezüglich wenig anfangen).
mfg
Ernst
Java:
package pack1;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class SubJFrame extends javax.swing.JFrame {
private SubJPanel subJPanel;
private Timer t;
private int testzahl;
private String teststr;
public SubJFrame() {
initComponents();
testzahl=0;
subJPanel = new SubJPanel();
// An die Zeichenfläche muss das SpielJFrame montiert werden.
jPanel1.add(subJPanel, "Center");
t = new Timer(2,
new ActionListener() {
public void actionPerformed(ActionEvent ae) {
testzahl++;
teststr = String.valueOf(testzahl);
jTextField1.setText(teststr);
//repaint();
}
});
t.start();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setBackground(new java.awt.Color(204, 255, 204));
jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
jPanel1.setLayout(new java.awt.BorderLayout());
jTextField1.setText("jTextField1");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 390, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(38, 38, 38)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(66, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SubJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
}
Java:
package pack1;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class SubJPanel extends javax.swing.JPanel {
private int ortX;
private int ortY;
public SubJPanel() {
initComponents();
ortX=0;
ortY=0;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillRect(ortX, ortY, 30, 25);
if(ortX <= 400){
ortX = ortX + 1;
}
else{
ortX=0;
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setBackground(new java.awt.Color(255, 255, 204));
setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 398, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 298, Short.MAX_VALUE)
);
}// </editor-fold>
// Variables declaration - do not modify
// End of variables declaration
}