1

我正面临一个令人沮丧的问题。我有一个应用程序,其中滚轮在 JDialog 窗口中不起作用(但在 JFrame 中起作用)。

这是代码:

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

public class Failtest extends JFrame {

 public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
       @Override
       public void run() {
          new Failtest();             
       }
    });

 }

 public Failtest() {
  super();
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  setTitle("FRAME");
  JScrollPane sp1 = new   JScrollPane(getNewList());
  add(sp1);
  setSize(150, 150);
        setVisible(true);


  JDialog d = new JDialog(this, false);// NOT WORKING
        //JDialog d = new JDialog((JFrame)null, false); // NOT WORKING
        //JDialog d = new JDialog((JDialog)null, false);// WORKING - WHY? 

  d.setTitle("DIALOG");
        d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  JScrollPane sp = new JScrollPane(getNewList());

  d.add(sp);
  d.setSize(150, 150);
  d.setVisible(true);
 }

 public JList getNewList() {
  String objs[] = new String[30];
  for(int i=0; i<objs.length; i++) {
  objs[i] = "Item "+i;
 }
 JList l = new JList(objs);
  return l;
 }
}

我找到了一个解决方案,它在 java 代码中作为注释出现 - 构造函数接收 (JDialog)null 参数。

有人可以启发我吗?我的观点是这是一个java错误。

在带有 1 个 JDK 和 2 个 JRE 的 Windows XP-SP3 上测试:

D:\Program Files\Java\jdk1.6.0_17\bin>javac -version
javac 1.6.0_17

D:\Program Files\Java\jdk1.6.0_17\bin>java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)

D:\Program Files\Java\jdk1.6.0_17\bin>cd ..

D:\Program Files\Java\jdk1.6.0_17>java -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

先感谢您,

尤利安·塞尔巴努

PS:问题不是新问题-代码取自论坛(此处),其中也提到了此问题-但没有解决方案(还)

稍后编辑: jre/jdk_1.6.0_10、1.6.0_16 也存在问题

后期编辑 2: 回到家,在 linux (Ubuntu - lucid/lynx) 上测试 - 使用来自发行版 repo 的 openjdk 和 sun-java 并且它可以工作(我使用在 Windows 上编译的 .class 文件)!!!- 所以我相信我正面临在某些 Windows 配置上发生的 JRE 错误。

4

4 回答 4

1

它不是错误,使用时:

 JDialog d = new JDialog(this, false);
 JDialog d = new JDialog((JFrame)null, false);

Frame在第一个参数中调用构造函数

但是使用的时候

 JDialog d = new JDialog((JDialog)null, false);

JDialog在第一个参数中调用构造函数

可能会令人困惑,因为两者都是,null但即使如此,您也应该指定您想要的构造函数。

更新
在您发表评论后,我才意识到问题所在:),但我无法重现它。鼠标在对话框和框架中滚动。我在 Snow Leopard 上使用 Java 1.6

于 2010-03-17T09:33:57.563 回答
1

我无法在我的系统上重现它(Windows 7 上的 Java 6u18)。但是,我怀疑这是一个焦点问题,当您使用构造函数的版本时,滚动窗格没有接收到鼠标事件,但是当您使用该JFrame版本时,JDialog它们却被接收到了JDialog

您可以在这里尝试几件事:

  1. 您可以尝试单击对话框和/或对话框的滚动条,并查看单击后鼠标滚动是否会影响滚动条。
  2. 您可以通过调用以编程方式请求滚动窗格的焦点requestFocusInWindow()
  3. 如果requestFocusInWindow()失败,请尝试requestFocus()。(requestFocus()不鼓励,因为它的行为因平台而异,但您似乎遇到了特定于平台的问题。)
  4. 您可以在滚动窗格中添加一个FocusListener来跟踪它何时获得和失去焦点,这应该可以帮助您确认此问题是否与焦点有关。
  5. 您可以在滚动窗格中添加一个MouseWheelListener以查看滚动窗格是否MouseWheelEvent接收到每个。

就像我说的那样,我无法在我的系统上重现这个问题,但是如果我要解决像你描述的那样的问题,我会尝试这些方法。

于 2010-03-18T01:18:30.987 回答
1

我知道这不太可能是答案,但是您能否请我们娱乐一下并修复您的错误代码,以便在 EDT 上创建框架(根据 Sun 的规范)?

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Failtest();             
        }
    });
}

在你完成之前,我不确定你可以排除任何事情。

我有一个在 JRE 1.6.0_20 上使用 Windows Vista 的“适合我的”。

于 2010-04-20T00:37:04.083 回答
0

您的 java 安装有些奇怪:您的默认版本不是您向我们展示的 1.6.0_17,而是更新的 1.6.0_18。

无论如何,在 Windows XP 上使用我的(稍微旧一点的)1.6.0_16 版本,我无法重现您的问题,让我认为这可能是 J 中的错误

于 2010-03-17T09:52:04.057 回答