在做基础的java swing程序时,我有一个奇怪的错误,我只在我的电脑上(我试过另外两个,一切都很好)。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class ModalDialogsTest extends JFrame implements ActionListener{
private JButton choice;
ModalDialogsTest(){
setSize(400,300);
JPanel panel = new JPanel();
getContentPane().add(panel);
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
choice = new JButton("My button");
panel.add(choice);
choice.addActionListener(this);
}
public void actionPerformed(ActionEvent event){
simpleStringChoiceDialog();
}
private void simpleStringChoiceDialog(){
Object[] possibilities = {"choice 1", "choice 2", "choice 3"};
String s = (String)JOptionPane.showInputDialog(
this, null, null,
JOptionPane.PLAIN_MESSAGE, null,
possibilities, possibilities[0]);
System.out.println(s);
}
public static void main(String[] args) {
ModalDialogsTest newWindow = new ModalDialogsTest();
newWindow.setVisible(true);
}
}
问题是当我点击下拉菜单选择一个选项时出现错误。错误是:
java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:2044)
at java.awt.Component.getLocationOnScreen(Component.java:2018)
at sun.lwawt.macosx.CAccessibility$22.call(CAccessibility.java:390)
at sun.lwawt.macosx.CAccessibility$22.call(CAccessibility.java:388)
at sun.lwawt.macosx.LWCToolkit$CallableWrapper.run(LWCToolkit.java:527)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:241)
at sun.lwawt.macosx.LWCToolkit$CPeerEvent.dispatch(LWCToolkit.java:684)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:155)
at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:182)
at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:221)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:219)
at java.awt.Dialog.show(Dialog.java:1077)
at javax.swing.JOptionPane.showInputDialog(JOptionPane.java:583)
at ModalDialogsTest.simpleStringChoiceDialog(ModalDialogsTest.java:109)
at ModalDialogsTest.actionPerformed(ModalDialogsTest.java:70)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:696)
at java.awt.EventQueue$4.run(EventQueue.java:694)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
choice 2
好的,这就是你问我的结果:
的System.out.println(System.getProperty( “java.vm.name”));给了我:
Java HotSpot(TM) 64-Bit Server VM.
System.getProperties()列表(的System.out)。给了我:
-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=/Library/Java/JavaVirtualMachines/jdk...
java.vm.version=23.3-b01
user.country.format=IE
gopherProxySet=false
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=:
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.country=FR
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=unknown
java.vm.specification.name=Java Virtual Machine Specification
user.dir=/Users/hugo/Documents/workspace/dialogs
java.runtime.version=1.7.0_07-b10
java.awt.graphicsenv=sun.awt.CGraphicsEnvironment
java.endorsed.dirs=/Library/Java/JavaVirtualMachines/jdk...
os.arch=x86_64
java.io.tmpdir=/var/folders/2n/q2bb2df90qqb_x38djlwx...
line.separator=
java.vm.specification.vendor=Oracle Corporation
os.name=Mac OS X
sun.jnu.encoding=US-ASCII
java.library.path=/Users/hugo/Library/Java/Extensions:/...
java.specification.name=Java Platform API Specification
java.class.version=51.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=10.8
http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
user.home=/Users/hugo
user.timezone=
java.awt.printerjob=sun.lwawt.macosx.CPrinterJob
file.encoding=US-ASCII
java.specification.version=1.7
user.name=hugo
java.class.path=/Users/hugo/Documents/workspace/dialo...
java.vm.specification.version=1.7
sun.arch.data.model=64
java.home=/Library/Java/JavaVirtualMachines/jdk...
sun.java.command=ModalDialogsTest
java.specification.vendor=Oracle Corporation
user.language=fr
user.language.format=en
awt.toolkit=sun.lwawt.macosx.LWCToolkit
java.vm.info=mixed mode
java.version=1.7.0_07
java.ext.dirs=/Users/hugo/Library/Java/Extensions:/...
sun.boot.class.path=/Library/Java/JavaVirtualMachines/jdk...
java.vendor=Oracle Corporation
file.separator=/
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeBig
sun.font.fontmanager=sun.font.CFontManager
socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16
ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
sun.cpu.isalist=
编辑:我忘了提到我在另一个mac上尝试过与我的完全相同(除了我有更多的内存但没关系)和Windows 7计算机上。
答案 0 :(得分:6)
我在Mac Yosemite上遇到了与Java 7相同的问题。在我的情况下,它是由第三方工具引起的,叫做" Cinch"我用来在桌面上安排我的窗户。取消激活该工具会使例外消失。
答案 1 :(得分:4)
您是否正在使用(另外优秀的)窗口管理增强器zooom?
我使用某些Java GUI始终会出现此错误,即使使用Matlab等商业软件也是如此。
除了混乱的控制台外,它似乎从来没有打扰任何功能。
不幸的是我没有解决方案。但也许知道这可能是有帮助的。
答案 2 :(得分:2)
重写为充满鳗鱼的气垫船说:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ModalDialogsTest newWindow = new ModalDialogsTest();
newWindow.setVisible(true);
}
});
}
不再出现例外情况。
编辑:
使用Oracle Java7编译和运行没有问题。看起来OpenJDK for Mac有一些issues。如果我没有看到这个,我会确信你没有发布整个堆栈跟踪。 请再次确认您已发布整个堆栈跟踪。如果您已发布整个堆栈跟踪,那么:
您使用的是OpenJDK还是Oracle Java?
另外两台电脑也是Mac或?
要检查您正在使用的JVM实现,请将此行放在代码中:
System.out.println(System.getProperty("java.vm.name"));
并发布输出。如果输出为null,则输入以下行:
System.getProperties().list(System.out);
并发布输出。
答案 3 :(得分:0)
只是一个想法。将您的panel
变量设为全局变量,然后将showInputDialog
的第一个参数从this
更改为panel
。
String s = (String)JOptionPane.showInputDialog(
panel, null, null,
JOptionPane.PLAIN_MESSAGE, null,
possibilities, possibilities[0]);
编辑:
我认为这些行
at javax.swing.JOptionPane.showInputDialog(JOptionPane.java:583)
at ModalDialogsTest.simpleStringChoiceDialog(ModalDialogsTest.java:109)
建议问题是parentComponent
的{{1}}参数。更改您的代码并创建showInputDialog
而不是扩展它。另请参阅this和this
编辑2:
我改变了你的代码,运行它,如果异常仍然存在,那么我不知道还有什么问题可能......
JFrame