Swing Ui倍增面板重影

jan*_*n b 1 java debugging user-interface swing

我最近和我的挥杆问题有关.一切正常,直到我从JButton触发工具提示.之后将鼠标移动到ui的其余部分会导致奇怪的伪像和故障.

窃听:

在此输入图像描述

我无法显示整个代码,因为它太多但在这里我初始化按钮:

    GridBagConstraints bottompane_gbc = new GridBagConstraints();
    toggleTorConnectionButton = new JButton();      
    toggleTorConnectionButton.setToolTipText("Toggles Tor Connection.");
    toggleTorConnectionButton.setIcon(new ImageIcon(ResourceHandler.Menueicon3_1));
    toggleTorConnectionButton.setMinimumSize(new Dimension(removeFinishedDownloads.getMinimumSize().width, toggleTorConnectionButton.getIcon().getIconHeight()+5));

    toggleTorConnectionButton.addActionListener(); // unimportant
    bottompane_gbc.gridy = 1;
    bottompane_gbc.fill = GridBagConstraints.BOTH;
    bottompane_gbc.insets = new Insets(0,15,10,5);
    bottompane.add(ToggleTorConnectionButton,bottompane_gbc);


    this.add(bottompane,BorderLayout.PAGE_END);
Run Code Online (Sandbox Code Playgroud)

如果有人需要更多的信息来帮助我请随意问.我有点绝望.XD

编辑:经过一些修补我猜测问题与swing和我的使用有关.目前我使用很多Eventlisteners(这是不是很糟糕?),这可能会减慢awt线程?以下是HPROF的简要摘录:http: //www.pastebucket.com/96444

编辑2:我能够在一个方便而简单的例子中重新创建错误.当你移动按钮时,等待工具提示,然后在ui上.你会看到鬼影:(.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class Main_frame {

    public static void main(String[] args) {
        new Main_frame();
    }

    public Main_frame() {
        JFrame frame = new JFrame("LOL");
        frame.setFocusable(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(new Dimension(400, 500));
        frame.setLocationRelativeTo(null);

        Download_window download_window = new Download_window();
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Download", null, download_window, "Main Download Window.");

        for (int i = 0; i < 5; i++) {
            JPanel pane = new JPanel();
            Dimension dim = new Dimension(370, 60);
            pane.setPreferredSize(dim);
            pane.setMaximumSize(dim);
            pane.setBackground(Color.blue);
            pane.setMinimumSize(dim);
            download_window.jobpanel.add(pane);
        }
        download_window.jobpanel.repaint();
        download_window.jobpanel.revalidate();

        frame.add(tabbedPane);
        frame.setVisible(true);
    }

    public class Download_window extends JPanel {

        JPanel jobpanel;

        public Download_window() {
            this.setLayout(new BorderLayout());

            jobpanel = new JPanel();
            jobpanel.setLayout(new BoxLayout(jobpanel, BoxLayout.Y_AXIS));

            JPanel bottompane = new JPanel();
            bottompane.setPreferredSize(new Dimension(385, 40));

            JButton toggleTorConnectionButton = new JButton();
            toggleTorConnectionButton.setPreferredSize(new Dimension(100, 50));
            toggleTorConnectionButton.setToolTipText("Toggles Tor Connection.");

            bottompane.add(toggleTorConnectionButton);

            this.add(bottompane, BorderLayout.PAGE_END);
            JScrollPane jobScrollPane = new JScrollPane(jobpanel);
            jobScrollPane.getVerticalScrollBar().setUnitIncrement(16);
            this.add(jobScrollPane, BorderLayout.CENTER);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑3:关于trashgods的想法,我使用了EventDispatchThread,我修改了setter来覆盖大小的getter,并且我通过使用trashgods代码划掉了不兼容性并且它工作正常....那么实际差异在哪里?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class Main_frame {

public static void main(String[] args) {
     EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main_frame();
            }
     });
}

public Main_frame() {
    JFrame frame = new JFrame("LOL");
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(new Dimension(400, 500));

    Download_window download_window = new Download_window();
    JTabbedPane tabbedPane = new JTabbedPane();
    tabbedPane.addTab("Download", null, download_window, "Main Download Window.");
    frame.add(tabbedPane);

    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

public class Download_window extends JPanel {

    JPanel jobpanel;

    public Download_window() {
        this.setLayout(new BorderLayout());

        jobpanel = new JPanel();
        jobpanel.setLayout(new BoxLayout(jobpanel, BoxLayout.Y_AXIS));
        for (int i = 0; i < 5; i++) {
            JPanel pane = new JPanel(){
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(370, 60);
                }
                @Override
                public Dimension getMaximumSize() {
                    return new Dimension(370, 60);
                }
                @Override
                public Dimension getMinimumSize() {
                    return new Dimension(370, 60);
                }
            };
            pane.setBackground(Color.blue);
            jobpanel.add(pane);
        }

        JPanel bottompane = new JPanel(){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(385, 40);
            }
        };

        JButton toggleTorConnectionButton = new JButton("Button"){
             @Override
             public Dimension getPreferredSize() {
                 return new Dimension(100, 30);
             }
        };
        toggleTorConnectionButton.setToolTipText("Toggles Tor Connection.");
        bottompane.add(toggleTorConnectionButton);
        this.add(bottompane, BorderLayout.PAGE_END);


        JScrollPane jobScrollPane = new JScrollPane(jobpanel);
        jobScrollPane.getVerticalScrollBar().setUnitIncrement(16);
        this.add(jobScrollPane, BorderLayout.CENTER);

    }
}
}
Run Code Online (Sandbox Code Playgroud)

有人可以自己验证这种奇怪的行为吗?您只需要在Edit3中复制并粘贴上面的代码.

tra*_*god 6

在我的平台上运行时,您的代码不会显示上面显示的任何故障.

  • 确认您没有绘画问题,例如忽略此处super.paintComponent()讨论的内容.

  • 请确认您有没有驱动程序不兼容,如讨论在这里.

  • 构造和修改事件派发线程上的所有GUI对象.

  • 不要使用set[Preferred|Maximum|Minimum]Size(),当你真的要覆盖get[Preferred|Maximum|Minimum]Size(),为讨论在这里.下面的示例覆盖getPreferredSize()滚动窗格,但可以实现Scrollable,如讨论在这里.

图片

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

/** @see https://stackoverflow.com/a/34319260/230513 */
public class MainFrame {

    private static final int H = 64;

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new MainFrame());
    }

    public MainFrame() {
        JFrame frame = new JFrame("LOL");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTabbedPane tabbedPane = new JTabbedPane();
        JPanel panel = new JPanel(new GridLayout(0, 1, 5, 5));
        for (int i = 0; i < 8; i++) {
            panel.add(new DownloadPanel());
        }
        JScrollPane jsp = new JScrollPane(panel) {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(6 * H, 4 * H);
            }
        };
        tabbedPane.addTab("Download", null, jsp, "Main Download Window.");
        tabbedPane.addTab("Options", null, null, "Options");
        frame.add(tabbedPane);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static class DownloadPanel extends JPanel {

        JPanel jobPanel = new JPanel();

        public DownloadPanel() {
            this.setLayout(new BorderLayout());
            this.setBackground(Color.lightGray);
            JProgressBar jpb = new JProgressBar();
            jpb.setIndeterminate(true);
            this.add(jpb);
            JPanel buttonPane = new JPanel();
            JButton toggleTorConnectionButton = new JButton("Button");
            toggleTorConnectionButton.setToolTipText("Toggles Tor Connection.");
            buttonPane.add(toggleTorConnectionButton);
            this.add(buttonPane, BorderLayout.WEST);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(4 * H, H);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)