Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程中的java异常";AWT-EventQueue-0“;java.lang.ClassCastException_Java_Multithreading_Swing - Fatal编程技术网

线程中的java异常";AWT-EventQueue-0“;java.lang.ClassCastException

线程中的java异常";AWT-EventQueue-0“;java.lang.ClassCastException,java,multithreading,swing,Java,Multithreading,Swing,当我运行swing应用程序时,有时在开始时会出现以下异常: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException at javax.swing.LayoutComparator.compare(Unknown Source) at javax.swing.LayoutComparator.compare(Unknown Source) at java.util.TimSort.countRunAndMakeAsce

当我运行swing应用程序时,有时在开始时会出现以下异常:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException
at javax.swing.LayoutComparator.compare(Unknown Source)
at javax.swing.LayoutComparator.compare(Unknown Source)
at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.ArrayList.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.getFocusTraversalCycle(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.getFirstComponent(Unknown Source)
at javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.getDefaultComponent(Unknown Source)
at java.awt.FocusTraversalPolicy.getInitialComponent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.SequencedEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
我已经找到了解决办法,但我不确定这是否完全解决了问题。 如果我改变:

public class MainFrame extends JFrame {
    ...
}
public static void main(String[] args){
    new MainFrame();
}
致:

我能确定这完全消除了上述异常的发生,并且在事件分派线程之外创建表单是导致错误的唯一原因吗

以下是我的应用程序的简化代码:

public class App {

    //MyFrame can be show independently or in a TabbedPane
    public static class MyFrame extends JFrame {
        public MyFrame() {
            setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));

            for (int i = 0; i < 8; i++) {
                JPanel panel = new JPanel();
                panel.setBorder(BorderFactory.createTitledBorder("Panel " + i));
                panel.add(new JLabel("label " + i));
                add(panel);
            }

            pack();
            setVisible(true);
        }
    }

    public static class MainTabsFrame extends JFrame {
        public MainTabsFrame() {
            JTabbedPane tabsPane = new JTabbedPane();

            JFrame frame = new MyFrame();
            tabsPane.addTab("My Frame 1", frame.getContentPane());
            frame.setVisible(false);

            add(tabsPane);
            pack();
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);

            setVisible(true);
        }
    }

    public static void main(String[] args) {
        new MainTabsFrame();
    }
}
公共类应用程序{
//MyFrame可以单独显示,也可以在选项卡窗格中显示
公共静态类MyFrame扩展了JFrame{
公共MyFrame(){
setLayout(新的BoxLayout(getContentPane(),BoxLayout.Y_轴));
对于(int i=0;i<8;i++){
JPanel面板=新的JPanel();
panel.setboorder(BorderFactory.createTitledBorder(“panel”+i));
添加(新的JLabel(“标签”+i));
添加(面板);
}
包装();
setVisible(真);
}
}
公共静态类MainTabsFrame扩展了JFrame{
公共MainTabsFrame(){
JTabbedPane选项卡span=新的JTabbedPane();
JFrame=新的MyFrame();
tabsPane.addTab(“我的帧1”,Frame.getContentPane());
frame.setVisible(假);
添加(tabsPane);
包装();
setLocationRelativeTo(空);
setDefaultCloseOperation(关闭时退出);
setVisible(真);
}
}
公共静态void main(字符串[]args){
新的主选项卡框架();
}
}

还需要一行代码

这是最终的解决方案:

public static void main(String[] args){
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JFrame _mf= new MainFrame();
            _mf.setVisible(true);
        }
    });
}

请记住,涉及Swing对象的每种操作都必须由事件调度线程执行,因此第一个JFrame的创建和可视化也是如此。

还需要一行代码

这是最终的解决方案:

public static void main(String[] args){
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JFrame _mf= new MainFrame();
            _mf.setVisible(true);
        }
    });
}

请记住,涉及Swing对象的每种操作都必须由事件调度线程执行,因此第一个JFrame的创建和可视化也是如此。

请提供一个示例,以便我们可以帮助您。您能否澄清“有时在开始时”是什么意思?启动应用程序时出现错误。我不能确切地说是什么时候,因为它是在swing EDT中抛出的,而且并不是所有的运行都会产生错误。错误是发生在您仅在主方法中使用MainTabsFrame时,还是发生在两者中?错误是发生在我单独在主方法MainTabsFrame中使用时。请提供一个示例,以便我们可以帮助您。您能否澄清您的意思,“有时候一开始“?启动应用程序时出错。我不能确切地说是什么时候,因为它是在swing EDT中抛出的,而且并不是所有的运行都会产生错误。错误发生在您只在main方法中使用MainTabsFrame时,还是两者都发生?错误发生在我单独在main方法MainTabsFrame中使用时。如果我检查swing对象的状态,例如“myJFrame.isVisible()'我也应该从EDT执行,对吗?应该更好,但是,从另一方面来说,您执行的是只读操作,因此没有必要。如果我检查swing对象的状态,例如'myJFrame.isVisible()'我也应该从EDT执行,对吗?应该更好,但从另一方面来说,您执行的是只读操作,所以没有必要。