Java 鼠标滚轮在JDialog中不滚动,但在JFrame中工作
我面临着一个令人沮丧的问题。我有一个应用程序,其中滚轮在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
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
版本时,却接收到鼠标事件
您可以在这里尝试以下几点:
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();
}
});
}