繁体   English   中英

在Java中重用swing组件

[英]Reusing swing components in Java

如果在将组件设置为不可见后更改了某个组件,则仅在组件设置为可见后重新绘制。 这使得闪烁(旧图形可见几毫秒):

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);
    }
}

我没有观察到任何闪烁。

为什么你不能打电话

    window.repaint(); 

在打电话之前手动

   setVisible(true); 

我无法在我的机器上重现闪烁..如果这没有帮助你可以尝试通话

   window.revalidate(); 

在重新粉刷之前

解决了 :)

只需要update(getGraphics()); (只是一个例子):

while (true) {

        window.label.setText("Lazy cat");
        window.update(window.getGraphics());//<------ new line
        window.setVisible(true);
        pause();
        window.setVisible(false);
        pause();

        window.label.setText(sb.toString());
        window.update(window.getGraphics());//<------ new line
        window.setVisible(true);
        pause();
        window.setVisible(false);
        pause();
    }

这里是关于repaint()update(Graphics g)之间区别的非常好的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM