目前,我遇到了Java - Swing中mouseMoved事件的问题。简单地说,我有一个JPanel,并且我将MouseMotionListener附加到它,以便在运行时隐藏或显示JscrollPane:
myPanel.addMouseMotionListener(new MousePresenter());我有自己的实现MouseMotionListener接口的类:
public class MousePresenter implements MouseMotionListener {
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (x>20 && x<200) {
hideScrollBar();
}
else {
showScrollBar();
}
}
} 问题是mouseMoved事件不够频繁地触发。在使用MouseMotionListener时,有没有相关的解决方案?
谢谢您抽时间见我。
发布于 2012-09-27 18:02:08
下面的方法似乎对我来说很好。请注意,事件的处理速度相当快:
public static void main( String[] args ) {
EventQueue.invokeLater( new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame( "TestFrame" );
JPanel content = new JPanel( new BorderLayout() );
final JLabel mousePosition = new JLabel( "Unknown" );
content.add( mousePosition, BorderLayout.NORTH );
content.addMouseMotionListener( new MouseMotionAdapter() {
@Override
public void mouseMoved( MouseEvent e ) {
mousePosition.setText( "X: " + e.getX() + " Y: " + e.getY() );
}
} );
frame.setContentPane( content );
frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
frame.pack();
frame.setVisible( true );
}
} );
}对于hideScrollBar方法,情况可能并非如此
发布于 2012-09-27 17:55:53
鼠标移动事件天生就很慢,因为它在每个像素变化时都会触发。
要优化整个问题,唯一可以做的就是优化回调处理程序中所做的事情。在你的情况下,你确实有
if (something)
doA();
else
doB();这意味着,在任何情况下,您都试图显示或隐藏滚动条,即使滚动条已经显示或隐藏。您可以做的是:
if (scrollBarIsVisible && x>20 && x<200) {
hideScrollBar();
scrollBarIsVisible = false;
}
else if (!scrollBarIsVisible) {
showScrollBar();
scrollBarIsVisible = true;
}这样,当从内部边界切换到外部边界时,您只需修改元素的可见性(这可能是一项繁重的操作,因为它可能需要重新布局内容)。这应该会大大降低计算运算量。
发布于 2012-09-27 17:56:10
如果您所有的代码都是在Event Dispatch线程中执行的,则可能会导致问题。看一下这个trail,并尝试将执行大量工作的任何代码放在SwingWorker线程中。
https://stackoverflow.com/questions/12618594
复制相似问题