【发布时间】:2010-02-22 08:49:05
【问题描述】:
我在对话框中有一个 JPanel。一个 MouseListener 监听鼠标移动,当鼠标在特定位置时,我在面板上调用 setCursor() 来改变光标。
这一切都很好,直到我从这个对话框中打开另一个对话框并再次关闭它。 (例如:一个警告信息(JOptionPane),或者一个新的自定义JDialog。这个动作之后,光标不再改变,虽然我还是调用了'setCursor'。
有人知道会发生什么吗?以及如何解决?
【问题讨论】:
我在对话框中有一个 JPanel。一个 MouseListener 监听鼠标移动,当鼠标在特定位置时,我在面板上调用 setCursor() 来改变光标。
这一切都很好,直到我从这个对话框中打开另一个对话框并再次关闭它。 (例如:一个警告信息(JOptionPane),或者一个新的自定义JDialog。这个动作之后,光标不再改变,虽然我还是调用了'setCursor'。
有人知道会发生什么吗?以及如何解决?
【问题讨论】:
我尝试了以下操作,但在显示另一个 JDialog(在 Windows 上,JDK 1.6.0_12)之后也能正常工作。
鼠标光标在水平方向每 50 个像素改变一次,单击JPanel 会打开一个模态JDialog。再次关闭它,鼠标光标仍然会改变。
public class DialogCursorTest extends JDialog{
public DialogCursorTest() {
final JPanel panel = new JPanel();
panel.addMouseMotionListener(new MouseMotionAdapter() {
Cursor handCursor = new Cursor(Cursor.HAND_CURSOR);
@Override
public void mouseMoved(MouseEvent e) {
if(e.getX() % 100 > 50) {
if(panel.getCursor() != handCursor) {
panel.setCursor(handCursor);
}
}
else {
if(panel.getCursor() == handCursor) {
panel.setCursor(Cursor.getDefaultCursor());
}
}
}
});
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
new JDialog(DialogCursorTest.this, "Test", true).setVisible(true);
}
});
getContentPane().add(panel);
}
public static void main(String[] args) {
DialogCursorTest test = new DialogCursorTest();
test.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
test.setSize(400, 300);
test.setVisible(true);
}
}
【讨论】:
我找到了解决方案:问题是我有 1 个框架和 1 个对话框。框架是主框架,随后创建对话框。从对话框中,我调用new JDialog(null, "title"); 而不是使用null,我应该添加调用对话框,因为关闭对话框后,焦点转到主框架,虽然在我的mac上看起来焦点在对话框上...
【讨论】:
focus 是指输入焦点,而不是鼠标焦点。