摆动Ui乘法板重影 [英] Swing Ui multiplying panel ghosting

查看:135
本文介绍了摆动Ui乘法板重影的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近有一个我的秋千的问题。一切正常,直到我触发了一个JButton的工具提示。然后将鼠标移动到其余的ui上,导致了奇怪的文物和毛刺。



Bugged: h1>



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

  GridBagConstraints bottompane_gbc = new GridBagConstraints(); 
toggleTorConnectionButton = new JButton();
toggleTorConnectionButton.setToolTipText(切换Tor连接);
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);

如果有人需要更多的信息来帮助我,请随时问问。 XD



编辑:
经过一些修补,我猜这个问题与swing和我的使用有关。目前我使用了大量的Eventlisteners(这是不好的?),这可能会减慢awt线程?
这是HPROF的简要摘录:

  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 http://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)); (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(下载,null,jsp,主下载窗口);
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 =新的JPanel();
JButton toggleTorConnectionButton = new JButton(Button);
toggleTorConnectionButton.setToolTipText(切换Tor连接);
buttonPane.add(toggleTorConnectionButton);
this.add(buttonPane,BorderLayout.WEST);
}

@Override
public Dimension getPreferredSize(){
return new Dimension(4 * H,H);
}
}
}


I've got a probelm with my swing ui lately. Everything works fine,untill i trigger a tooltip from a JButton.After that moving the mouse over the rest of the ui is causing weird artifacts and glitching.

Bugged:

I can't show the whole code because its too much but here im initialising the button :

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

If anybody needs more information to help me pls feel free to ask.Im kind of desperated. XD

EDIT: After some tinkering im guessing that the problem is related to swing and my use of it.Currently im using alot of Eventlisteners (is this bad?), that might slow down the awt thread ? Here is a brief extract from HPROF: http://www.pastebucket.com/96444

EDIT 2: I was able to recreate the error in a handy and simple example. When you move over the button,wait for the tooltip and then over the ui.You will see ghosting :(.

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

        }
    }
}

Edit 3: Concerning trashgods ideas, I used the EventDispatchThread, I modified the setter to override the getter for size and i crossed out incompatibility by using trashgods code and it was working fine.... So where is the actual difference?

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

    }
}
}

Could anyone please verify that strange behavior himself? You just need to copy&paste the code from above in Edit3.

解决方案

Your code exhibits none of the glitches shown above when run on my platform.

  • Verify that you have no painting problems e.g. neglecting super.paintComponent() as discussed here.

  • Verify that you have no driver incompatibilities, as discussed here.

  • Construct and modify all GUI objects on the event dispatch thread.

  • Don't use set[Preferred|Maximum|Minimum]Size() when you really mean to override get[Preferred|Maximum|Minimum]Size(), as discussed here. The example below overrides getPreferredSize() on the scroll pane, but you can implement Scrollable, as discussed here.

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 http://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);
        }
    }
}

这篇关于摆动Ui乘法板重影的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆