java - Swing CardLayout 运行时错误

标签 java swing layout-manager classcastexception cardlayout

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

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.BorderLayout cannot be cast to java.awt.CardLayout at tester.actionPerformed(tester.java:36) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(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$200(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$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.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$1.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)

我已经将 JFrame 布局设置为 CardLayout,因此当我使用 this.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();
    }
}

最佳答案

快速解决方法是引用CardLayout直接和内容 Pane 。即。

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 的实例在其中显示面板(而不是扩展框架)。

关于java - Swing CardLayout 运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24003061/

相关文章:

java - Selenium2 的 Select 对象不会在 IE8 中触发 onchange 事件

Java正则表达式匹配字符串中的所有单词

java - 当我使用 JButton 调用类时 JFrame 卡住

java - 尝试将布局设置为 BoxLayout

java - 一次由一个客户端访问

java - Couchbase View 结果与 JAVA 和 REST 不同

java - 如何删除行并编辑 JTable 上保存的任何数据并将其更新到 mySQL 数据库

java - 在java中获取具有焦点的组件

java - 混合网格布局和边框布局

java - 尝试将两个按钮绘制在彼此之上