我试图使用GlassPane在我的Swing应用程序中进行可视化拖放,但遇到了拖拽图像滞后于鼠标指针的问题。我该如何解决这个问题?我的GlassPane代码如下。谢谢!
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);
}
}发布于 2011-06-23 20:27:10
根据Javadoc的说法
如果一个子类只是想要专门化UI (外观)委托的
方法,那么它就应该覆盖paintComponent。
这是因为paint(...)实际上将绘制工作委托给了三个受保护的方法:paintComponent、paintBorder和paintChildren。也就是说,试着用下面的代码替换paint(...)
@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();
}
}发布于 2011-06-23 20:13:53
也许你不应该在每次重新绘制时创建一个new Color(0.0f, 0.25f, 1.0f)。
对我来说,这场表演相当不错。
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 );
}
});
}
}https://stackoverflow.com/questions/6453743
复制相似问题