【问题标题】:Swing CardLayout Runtime ErrorSwing CardLayout 运行时错误
【发布时间】:2014-07-23 01:46:59
【问题描述】:

这个程序应该向 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.processMouseEvent(未知来源) 在 javax.swing.JComponent.processMouseEvent(未知来源) 在 java.awt.Component.processEvent(未知来源) 在 java.awt.Container.processEvent(未知来源) 在 java.awt.Component.dispatchEventImpl(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.LightweightDispatcher.retargetMouseEvent(未知来源) 在 java.awt.LightweightDispatcher.processMouseEvent(未知来源) 在 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,所以当我使用 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();
    }
}

【问题讨论】:

    标签: java swing layout-manager classcastexception cardlayout


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多