如果在组件设置为不可见后更改了某个组件,则仅在组件设置为可见后才重新绘制。这会导致闪烁(旧图形在几毫秒内可见):
package test;
import javax.swing.*;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
class ReusingWindow extends JWindow {
JLabel label;
public ReusingWindow() {
JPanel panel = new JPanel(new BorderLayout());
panel.setPreferredSize(new Dimension(300, 200));
panel.setBackground(Color.WHITE);
panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
label = new JLabel("Lazy cat");
label.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
label.setBackground(Color.red);
label.setOpaque(true);
panel.add(label, BorderLayout.WEST);
add(panel);
pack();
setLocationRelativeTo(null);
}
public static void main(String args[]) {
ReusingWindow window = new ReusingWindow();
StringBuilder sb = new StringBuilder();
sb.append("<html>");
for (int a = 0; a < 10; a++){
sb.append("Not very lazy cat. Extremelly fast cat.<br>");
}
sb.append("</html>");
while (true) {
window.label.setText("Lazy cat");
window.setVisible(true);
pause();
window.setVisible(false);
pause();
window.label.setText(sb.toString());
window.setVisible(true);
pause();
window.setVisible(false);
pause();
}
}
private static void pause() {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(ReusingWindow.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
除了每次在设置新窗口可见之前创建新窗口之外,还有什么解决办法吗?
最佳答案
问题可能出在您的“重用窗口”上。使用像
这样的简单类static class ReusingWindow extends JFrame {
JLabel label = new JLabel();
public ReusingWindow() {
add(label);
setBounds(0, 0, 100, 100);
}
}
我没有观察到任何闪烁。
关于java - 在 Java 中重用 swing 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18824383/