java JTextField paintComponent 方法被重复调用。那是正常的吗?
java JTextField paintComponent Method called repeatedly. Is that normal?
将 JTextField 子类化后,我注意到当 Field 具有焦点时,paintComponent 方法会被重复调用(大约每半秒一次),即使没有用户交互也是如此。
我阅读了 Oracle 文章 "Painting in AWT and Swing",但没有找到任何启示。
这是正常现象,还是漏掉了什么?
这是我的示例 Proggy:
(将 Cursor 定位在第二个 - 未子类 - 没有日志记录的 JTextField 中,导致带有日志记录的子类失去 Focus,停止重复重绘)
import java.awt.*;
import javax.swing.*;
public class SwingPaintDemo2 extends JFrame {
public SwingPaintDemo2(final String title) {
super(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Box box = new Box(BoxLayout.Y_AXIS);
box.add(new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(250, 200);
}
@Override
public void paintComponent(final Graphics g) {
super .paintComponent( g);
System.out.println("MyPanel.paintComponent......: " + g);
g.drawString("This is my custom Panel!", 10, 20);
}
});
box.add(new JTextField("JayTekst") {
@Override
public void paintComponent(final Graphics g) {
super .paintComponent( g);
System.out.println("JayTextField.paintComponent.: " + g);
}
});
box.add(new JTextField("JText"));
this.add(box);
this.pack();
this.setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(() -> new SwingPaintDemo2("Swing Paint Demo"));
}
}
当然是正常的。当 textfield
获得焦点时,您可以看到光标闪烁,这意味着您看到 textfield
具有新的视觉表示,这意味着 paintComponent()
.
将 JTextField 子类化后,我注意到当 Field 具有焦点时,paintComponent 方法会被重复调用(大约每半秒一次),即使没有用户交互也是如此。
我阅读了 Oracle 文章 "Painting in AWT and Swing",但没有找到任何启示。
这是正常现象,还是漏掉了什么?
这是我的示例 Proggy:
(将 Cursor 定位在第二个 - 未子类 - 没有日志记录的 JTextField 中,导致带有日志记录的子类失去 Focus,停止重复重绘)
import java.awt.*;
import javax.swing.*;
public class SwingPaintDemo2 extends JFrame {
public SwingPaintDemo2(final String title) {
super(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Box box = new Box(BoxLayout.Y_AXIS);
box.add(new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(250, 200);
}
@Override
public void paintComponent(final Graphics g) {
super .paintComponent( g);
System.out.println("MyPanel.paintComponent......: " + g);
g.drawString("This is my custom Panel!", 10, 20);
}
});
box.add(new JTextField("JayTekst") {
@Override
public void paintComponent(final Graphics g) {
super .paintComponent( g);
System.out.println("JayTextField.paintComponent.: " + g);
}
});
box.add(new JTextField("JText"));
this.add(box);
this.pack();
this.setVisible(true);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(() -> new SwingPaintDemo2("Swing Paint Demo"));
}
}
当然是正常的。当 textfield
获得焦点时,您可以看到光标闪烁,这意味着您看到 textfield
具有新的视觉表示,这意味着 paintComponent()
.