Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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 Swing CardLayout运行时错误_Java_Swing_Layout Manager_Classcastexception_Cardlayout - Fatal编程技术网

Java Swing CardLayout运行时错误

Java Swing CardLayout运行时错误,java,swing,layout-manager,classcastexception,cardlayout,Java,Swing,Layout Manager,Classcastexception,Cardlayout,这个程序应该在JFrame中添加两个面板,每个面板都有一个切换按钮,允许用户在每个面板之间切换。它可以很好地编译,但当我尝试单击switch1按钮时,出现以下错误: 线程“AWT-EventQueue-0”java.lang.ClassCastException中的异常:无法将java.AWT.BorderLayout转换为java.AWT.CardLayout 在tester.actionPerformed(tester.java:36) 在javax.swing.AbstractButton

这个程序应该在JFrame中添加两个面板,每个面板都有一个切换按钮,允许用户在每个面板之间切换。它可以很好地编译,但当我尝试单击switch1按钮时,出现以下错误:

线程“AWT-EventQueue-0”java.lang.ClassCastException中的异常:无法将java.AWT.BorderLayout转换为java.AWT.CardLayout 在tester.actionPerformed(tester.java:36) 在javax.swing.AbstractButton.fireActionPerformed(未知源) 位于javax.swing.AbstractButton$Handler.actionPerformed(未知源) 在javax.swing.DefaultButtonModel.fireActionPerformed(未知源) 位于javax.swing.DefaultButtonModel.setPressed(未知源) 位于javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知源代码) 位于java.awt.Component.ProcessMouseeEvent(未知源) 位于javax.swing.JComponent.ProcessMouseeEvent(未知源) 位于java.awt.Component.processEvent(未知源) 位于java.awt.Container.processEvent(未知源) 位于java.awt.Component.dispatchEventImpl(未知源) 位于java.awt.Container.dispatchEventImpl(未知源) 位于java.awt.Component.dispatchEvent(未知源) 位于java.awt.LightweightDispatcher.RetargetMouseeEvent(未知源) 位于java.awt.LightweightDispatcher.ProcessMouseeEvent(未知源) 位于java.awt.LightweightDispatcher.dispatchEvent(未知源) 位于java.awt.Container.dispatchEventImpl(未知源) 位于java.awt.Window.dispatchEventImpl(未知源) 位于java.awt.Component.dispatchEvent(未知源) 位于java.awt.EventQueue.dispatchEventImpl(未知源) 位于java.awt.EventQueue.access$200(未知源) 在java.awt.EventQueue$3.run处(未知源) 在java.awt.EventQueue$3.run处(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源) 在java.awt.EventQueue$4.run处(未知源) 在java.awt.EventQueue$4.run处(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源) 位于java.awt.EventQueue.dispatchEvent(未知源) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源) 位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源) 位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源) 位于java.awt.EventDispatchThread.pumpEvents(未知源) 位于java.awt.EventDispatchThread.pumpEvents(未知源) 位于java.awt.EventDispatchThread.run(未知源)

我已经将JFrame布局设置为CardLayout,所以当我使用这个.getLayout()时,它应该返回一个CardLayout对象。以下是节目:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class tester extends JFrame implements ActionListener
{
    CardLayout cc = new CardLayout();
    JLabel text1 = new JLabel("Panel 1");
        JLabel text2 = new JLabel("Panel 2");
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JButton switch1 = new JButton("Switch1");
    JButton switch2 = new JButton("Switch2");
    boolean panel = true;

    public tester()
    { 
        setSize(100, 100);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(cc);
        switch1.addActionListener(this);
        switch2.addActionListener(this);
        panel1.add(switch1);
        panel1.add(text1);
        panel2.add(switch2);
        panel2.add(text2);
        add(panel1, "Panel 1");
        add(panel2, "Panel 2");
        setVisible(true);
    }

    public void actionPerformed(ActionEvent evt)
    {
        if(panel)
        {
            CardLayout pane = (CardLayout)this.getLayout();
            pane.last(this);
            panel = false;
        }
        else
        {
            CardLayout pane = (CardLayout)this.getLayout();
            pane.first(this);
            panel = true;
        }
        repaint();
    }

    public static void main(String[] args)
    {
        tester test = new tester();
    }
}

快速修复方法是直接引用
卡片布局
和内容窗格。即

public void actionPerformed(ActionEvent evt)
{
    if(panel)
    {
        //CardLayout pane = (CardLayout)this.getLayout();
        cc.last(this.getContentPane());
        panel = false;
    }
    else
    {
        //CardLayout pane = (CardLayout)this.getLayout();
        cc.first(this.getContentPane());
        panel = true;
    }
    //repaint(); not necessary either..
}
更好的解决方法是在
JPanel
中设计GUI(并在其中使用
CardLayout
),并简单地创建一个
JFrame
的实例来显示面板(而不是扩展框架)