0

有时(并非总是)在滚动我的 JScrollPane 的栏时,某些组件(通常是 JLabels 之类的文本组件)不会正确地重新绘制,它们最终只会被部分呈现。

我不知道这是为什么。我尝试在 AdjustmentListener 中调用paint(),但这似乎没有帮助。

有任何想法吗?

编辑:组件的初始化

    panel = new JPanel();
    ImageIcon img = new ImageIcon("editor.png");
    setIconImage(img.getImage());
    initComponents();

    final JScrollPane pane = new JScrollPane(panel);
    this.setContentPane(pane);
    //pane.setLayout(new ScrollPaneLayout());
    //pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    Dimension dim = panel.getSize();
    dim.height = dim.height - 100;
    pane.setSize(dim);
    this.setSize(dim);
    AdjustmentListener hListener = new AdjustmentListener() {
        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
            repaint();
            for(Component c : panel.getComponents())
                c.repaint();
            for(Component c : pane.getComponents())
                c.repaint();
            panel.repaint();
            panel.revalidate();
            pane.repaint();
            pane.revalidate();
        }
    };
    pane.getVerticalScrollBar().addAdjustmentListener(hListener);
    panel.setVisible(true);
    pane.setVisible(true);
4

1 回答 1

8

违反任何这些基本原则都可能导致渲染伪影。

  • 验证 Swing GUI 对象是否事件分派线程上构造和操作。

  • 确保您尊重opacity属性。特别JLabel是,默认情况下不是不透明的。

  • “Swing 程序应该覆盖paintComponent()而不是覆盖paint()。”—<a href="http://java.sun.com/products/jfc/tsc/articles/painting/index.html#callbacks" rel="nofollow noreferrer">绘画在 AWT 和 Swing:绘制方法中。

附录:结合这些格言,这个相关示例JLabel在没有工件的情况下滚动了数千个闪烁的实例。

于 2012-07-09T04:21:00.830 回答