首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Swing GlassPane拖动性能

Java Swing GlassPane拖动性能
EN

Stack Overflow用户
提问于 2011-06-23 20:09:05
回答 2查看 1.2K关注 0票数 1

我试图使用GlassPane在我的Swing应用程序中进行可视化拖放,但遇到了拖拽图像滞后于鼠标指针的问题。我该如何解决这个问题?我的GlassPane代码如下。谢谢!

代码语言:javascript
复制
package dragui;

import java.awt.*;
import javax.swing.*;
import java.awt.event.MouseEvent;
import javax.swing.event.MouseInputAdapter;

public class GlassPane extends JComponent {
    private int x=0, y=0, k=25,z=1;
    private boolean showDot;
    private MouseInputAdapter mia = new MouseInputAdapter(){

        @Override
        public void mouseDragged(MouseEvent me) {
            setPos(me.getX(), me.getY());
        }

        @Override
        public void mousePressed(MouseEvent me) {
            setShow(true);
            setPos(me.getX(), me.getY());   
        }

        @Override
        public void mouseReleased(MouseEvent me){
            setShow(false);
            setVisible(false);
        }
    };

    public void setShow(boolean b){ this.showDot = b; }

    public void paint(Graphics g) {
        if (showDot) {
            g.setColor(new Color(0.0f, 0.25f, 1.0f));
            g.fillOval(x - k, y - k, 2*k, 2*k);
        }
    }

    public void setPos(int x, int y) {
        int tmpX = this.x, tmpY = this.y; 
        this.x = x; this.y = y;
        repaint(tmpX - k , tmpY-k, 2*k+5, 2*k+5);
        repaint(this.x-k, this.y-k, 2*k+5, 2*k+5);        
    }

    public GlassPane() {
        addMouseListener(mia); 
        addMouseMotionListener(mia);
        setOpaque(false);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-23 20:27:10

根据Javadoc的说法

如果一个子类只是想要专门化UI (外观)委托的

方法,那么它就应该覆盖paintComponent。

这是因为paint(...)实际上将绘制工作委托给了三个受保护的方法:paintComponentpaintBorderpaintChildren。也就是说,试着用下面的代码替换paint(...)

代码语言:javascript
复制
@Override
protected void paintComponent(Graphics g) {
    if (showDot) {
        Graphics gCopy = g.create();

        gCopy.setColor(new Color(0.0f, 0.25f, 1.0f));
        gCopy.fillOval(x - k, y - k, 2*k, 2*k);

        gCopy.dispose();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2011-06-23 20:13:53

也许你不应该在每次重新绘制时创建一个new Color(0.0f, 0.25f, 1.0f)

对我来说,这场表演相当不错。

代码语言:javascript
复制
public class Example {
    static public void main( String[] s ) {
        EventQueue.invokeLater( new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.setBounds( 50, 50, 600, 600 );
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                frame.setGlassPane( new JComponent() {
                    {
                        MouseInputAdapter mia = new MouseInputAdapter(){
                            public void mouseDragged(MouseEvent me) {
                                setPos(me.getX(), me.getY());
                            }
                            public void mousePressed(MouseEvent me) {
                                setShow(true);
                                setPos(me.getX(), me.getY());   
                            }
                            public void mouseReleased(MouseEvent me){
                                setShow(false);
                                setVisible(false);
                            }
                        };
                        addMouseListener(mia); 
                        addMouseMotionListener(mia);
                        setOpaque(false);
                    }
                    private int x=0, y=0, k=25,z=1;
                    private boolean showDot;
                    public void setShow(boolean b){ this.showDot = b; }
                    private Color color = new Color(0.0f, 0.25f, 1.0f);
                    public void paintComponent(Graphics g) {
                        if (showDot) {
                            g.setColor(color);
                            g.fillOval(x - k, y - k, 2*k, 2*k);
                        }
                    }
                    public void setPos(int x, int y) {
                        int tmpX = this.x, tmpY = this.y; 
                        this.x = x; this.y = y;
                        repaint(tmpX - k , tmpY-k, 2*k+5, 2*k+5);
                        repaint(this.x-k, this.y-k, 2*k+5, 2*k+5);        
                    }
                } );
                frame.getGlassPane().setVisible( true );
                frame.setVisible( true );
            }
        });
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6453743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档