Java 鼠标滚轮在JDialog中不滚动,但在JFrame中工作

Java 鼠标滚轮在JDialog中不滚动,但在JFrame中工作,java,swing,scroll,jdialog,Java,Swing,Scroll,Jdialog,我面临着一个令人沮丧的问题。我有一个应用程序,其中滚轮在JDialog窗口中不工作(但在JFrame中工作) 代码如下: import javax.swing.*; import java.awt.event.*; public class Failtest extends JFrame { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Ove

我面临着一个令人沮丧的问题。我有一个应用程序,其中滚轮在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;
 }
}
提前谢谢大家,

尤利安·埃尔布·诺尤

PS:这个问题并不是新问题——代码取自一个论坛(),其中也提到了这个问题——但还没有解决方案

以后编辑: 这个问题在jre/jdk_1.6.0_10和1.6.0_16中仍然存在

稍后编辑2:
回到家里,在linux(Ubuntu-lucid/lynx)上进行了测试——使用了distribution repo的openjdk和sun java,并且运行正常(我使用了在Windows上编译的.class文件)因此,我相信我在某些Windows配置上遇到了一个JRE错误。

当使用以下配置时,这不是一个错误:

 JDialog d = new JDialog(this, false);
 JDialog d = new JDialog((JFrame)null, false);
您正在使用第一个参数中的帧调用构造函数

但是当使用

 JDialog d = new JDialog((JDialog)null, false);
您正在使用第一个参数中的JDialog调用构造函数

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

更新

在你的评论之后,我才意识到问题所在:),不过我无法重现。鼠标在对话框和框架中滚动。我在雪豹上使用Java 1.6,您的Java安装有些奇怪:您的默认版本不是您展示给我们的1.6.0_17,而是更新的1.6.0_18


无论如何,在Windows XP上使用我的(稍旧一点的)1.6.0_16版本,我无法重现您的问题,让我认为这可能是J中的一个bug,我还无法在我的系统上重现这个问题(Windows 7上的Java 6u18)。但是,我怀疑这是一个焦点问题,当您使用
JDialog
构造函数的
JFrame
版本时,滚动窗格没有接收到鼠标事件,而当您使用
JDialog
版本时,却接收到鼠标事件

您可以在这里尝试以下几点:

  • 您可以尝试单击对话框和/或对话框的滚动条,查看单击后鼠标滚动是否会影响滚动条
  • 您可以通过调用为scrollpane编程请求焦点
  • 如果
    requestFocusInWindow()
    失败,请重试。(
    requestFocus()
    由于其行为中存在特定于平台的变化而不受鼓励,但您似乎遇到了特定于平台的问题。)
  • 您可以在滚动窗格中添加一个,以跟踪它何时获得和失去焦点,这将帮助您确认此问题是否与焦点有关
  • 您可以向滚动窗格中添加一个,以查看滚动窗格是否接收到每个

  • 正如我所说,我无法在我的系统上重现这个问题,但如果我对您描述的问题进行故障排除,我会尝试这些方法。

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

    在你完成之前,我不确定你能排除任何可能性


    我在JRE 1.6.0_20上使用Windows Vista获得了一个“为我工作”的功能。

    那么为什么滚动条只在“(JDialog)null”情况下工作?这才是真正的问题。实际上,我需要一个解释——这个解决方案对我来说只是简单地看一下命令行。对于开发,我使用JDK1.6.0_17(其中也包含相同版本的JRE),但系统(当我移出bin目录时)有一个较新的JRE(1.6.0_18)。当然,是的,但出于一致性的考虑,我个人倾向于使用系统默认使用的JDK进行开发。无论如何,我无法在我的JDK1.6.0_16中重现您的行为,这很奇怪。事实上,我正在下载JDK1.6.0_16,并将检查结果。感谢hintI编辑的答案-即使是JDK1.6.016,问题仍然存在,我们是否也在考虑同样的问题?通过在我的盒子上测试,我相信它和我的版本一起工作,但你说不行。所以,这里是我的测试:我获取了您的代码,编译它,然后运行它。显示了两个窗口,一个标题为“框架”,另一个标题为“对话框”。当我滚动滚轮时,每一个按钮上都没有点击,什么也没有发生。但当我单击窗口标题栏并滚动时,列表会正确移动。那么,什么是有缺陷的行为?请不要给我们提出二合一的问题。你能详细说明一下吗?我只是说在某些配置(XP SP3我的情况下)上这不适用于JDialog,如果可能的话,我想知道一个解决方法。我现在知道,在某些配置(使用相同JRE的事件)上,您是对的-这不是答案,但我确实根据您的建议修改了代码+1美元。谢谢
     JDialog d = new JDialog((JDialog)null, false);
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Failtest();             
            }
        });
    }