【问题标题】:Mouse wheel not scrolling in JDialog but working in JFrame鼠标滚轮不在 JDialog 中滚动,但在 JFrame 中工作
【发布时间】:2011-01-28 11:53:15
【问题描述】:

我正面临一个令人沮丧的问题。我有一个应用程序,其中滚轮在 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:这个问题并不新鲜 - 代码取自一个论坛 (here),其中也提到了这个问题 - 但没有解决方案(目前)

稍后编辑: jre/jdk_1.6.0_10, 1.6.0_16 问题依然存在

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

【问题讨论】:

  • 请不要二合一地给我们问题。
  • 您能详细说明一下吗?我只是说这不适用于 JDialog 在某些配置上(我的情况是 XP SP3),如果可能的话,我想知道一种解决方法。我现在知道在某些配置(具有相同 JRE 的事件)上它可以工作

标签: java swing scroll jdialog


【解决方案1】:

这不是bug,使用时:

 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

【讨论】:

  • 那么为什么滚动只在“(JDialog)null”情况下有效?这是真正的问题。我实际上需要一个解释 - 这个解决方案对我来说只是一个 hack
【解决方案2】:

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

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

【讨论】:

  • 看命令行。对于开发,我使用 JDK 1.6.0_17(其中还包含具有相同版本的 JRE)但系统(当我移出 bin 目录时)具有更新的 JRE (1.6.0_18)
  • 是的,当然,但是为了连贯性,我个人倾向于使用系统默认使用的 JDK 进行开发。无论如何,我无法在我的 JDK 1.6.0_16 中重现你的行为,这很奇怪。
  • 确实 - 我正在下载 JDK 1.6.0_16 并将检查结果。感谢提示
  • 我编辑了答案 - 即使使用 jdk 1.6.0_16,问题仍然存在
  • 我们谈论的是同一件事吗?通过在我的盒子上测试它,我相信它适用于我的版本,但你说它没有。所以,这是我的测试:我拿了你的代码,编译它,然后运行它。显示了两个窗口,一个名为“FRAME”,另一个名为“DIALOG”。在他们每个人身上,没有点击它,当我滚动滚轮时,什么也没有发生。但是当我单击窗口标题栏并滚动时,列表会正确移动。那么,有缺陷的行为是什么?
【解决方案3】:

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

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

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

就像我说的,我无法在我的系统上重现此问题,但如果我要解决您所描述的问题,我会尝试这些方法。

【讨论】:

    【解决方案4】:

    我知道这不太可能是答案,但请您招待我们并修复您的错误代码,以便在 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 “为我工作”。

    【讨论】:

    • 你是对的 - 这不是答案,但我确实根据你的建议修改了代码。为此+1。谢谢
    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2017-02-27
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多