2010-03-17 59 views
1

我正面临令人沮丧的问题。我有一个应用程序的滚轮不能在JDialog窗口中工作(但工作在JFrame中)。鼠标滚轮不在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错误。

测试在Windows XP-SP3与1 JDK和2周的JRE:

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) 

谢谢你在前进,

尤利安Şerbănoiu

PS:这个问题是不是新的 - 代码从一个论坛(here),其中也提到了这个问题 - 但没有解决它(但)

后编辑: 问题与JRE/jdk_1.6.0_10仍然存在,也1.6.0_16

稍后编辑2: 回到家里,在Linux上测试(Ubuntu的 - 清醒/猞猁) - 都与OpenJDK的和Sun的Java从分配回购和它的作品(我使用Windows上编译的.class文件)! - 所以我相信我正面临着某些Windows配置上发生的JRE错误。

+0

请不要给我们提问2合1。 – 2010-03-17 22:50:28

+0

请您详细说明一下吗?我只是说这在某些配置(XP SP3我的情况)下不适用于JDialog,如果可能,我想知道一个解决方法。我现在知道,在某些配置(具有相同JRE的事件)上,它的工作原理是 – INS 2010-03-18 11:52:12

回答

0

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

无论如何,Windows XP上使用我的(只是一个年纪大一点的)1.6.0_16版,我无法重现您的问题,让我觉得这可能是J A错误

+0

看看命令行。对于开发我使用JDK 1.6.0_17(其中也包含JRE具有相同的版本),但系统(当我移出bin目录时)有一个更新的JRE(1.6.0_18) – INS 2010-03-17 09:55:18

+0

当然是的,但我个人倾向于为了一致性,使用systelm默认使用的JDK进行开发。无论如何,我无法在JDK 1.6.0_16中重现您的行为,这很奇怪。 – Riduidel 2010-03-17 10:16:20

+0

的确 - 我正在下载JDK 1.6.0_16并检查结果。感谢提示 – INS 2010-03-17 10:24:08

1

它不是一个错误,使用时:

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

要调用与Frame构造函数中的第一个参数

但使用

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

您呼叫的时候构造函数与JDialog在第一个pa rameter

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

UPDATE
您的评论后,我才意识到什么问题:),即时通讯无法虽然重现。鼠标同时在对话框和框架中滚动。我在Snow Leopard上使用Java 1.6

+0

那么为什么滚动仅在“(JDialog)null”情况下起作用?这是真正的问题。我实际上需要一个解释 - 这个解决方案对我来说只是*一个黑客 – INS 2010-03-17 09:38:11

1

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

一些东西,你可以试一下:

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

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

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的“适合我”。

+0

您是对的 - 这不是答案,但我根据您的建议修改了代码。 +1。谢谢 – INS 2010-04-21 08:20:26