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

时间:2010-03-17 09:23:27

标签: 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() {
       @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 bug。

在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)

提前谢谢你,

IulianŞerbănoiu

PS:问题不是新问题 - 代码来自一个论坛(here),其中也提到了这个问题 - 但没有解决方案(尚未)

LATER EDIT: 问题仍然存在于jre / jdk_1.6.0_10,1.6.0_16

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

您可以尝试以下几种方法:

  1. 您可以尝试单击对话框和/或对话框的滚动条,看看鼠标滚动是否会影响滚动条。
  2. 您可以通过调用requestFocusInWindow()以编程方式请求滚动窗格的焦点。
  3. 如果requestFocusInWindow()失败,请尝试requestFocus()。 (requestFocus()因其行为的特定于平台的变化而不鼓励,但您似乎有特定于平台的问题。)
  4. 您可以在滚动窗格中添加FocusListener以跟踪它何时获得并失去焦点,这可以帮助您确认此问题是否与焦点有关。
  5. 您可以在滚动窗格中添加MouseWheelListener,以查看滚动窗格是否收到了每个MouseWheelEvent
  6. 就像我说的那样,我无法在我的系统上重现这个问题,但如果我正在解决你所描述的问题,我会尝试这些问题。

答案 2 :(得分: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获得了“适合我”。

答案 3 :(得分:0)

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

无论如何,在Windows XP上使用我的(只是一个旧的)1.6.0_16版本,我无法重现你的问题,让我觉得它可能是J中的一个错误