CardLayout之前的功能不起作用?

2023-12-13

我的卡片布局的下一个功能可以正常工作,但上一个功能却不能正常工作。就我而言,只需“layout.previous(_);" 在我的 makePanel() 方法的 actionPerformed 方法主体中应该可以工作,但是当我运行程序并单击上一个按钮时,没有任何反应。我做错了什么? –

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


public class Temp
{
    public static void main (String[] args)
    {
        new MakeAQuiz();
    }

    static class MakeAQuiz 
{

    private JPanel start, base, fields, buttonz, question;
    private String [] labels = {"Enter your question: ", "Answer 1: ", "Answer 2: ", "Answer 3: ", "Answer 4: "};
    private JButton [] buttons = {new JButton("<<Go back"), new JButton("I'm done"), new JButton("Next>>")};
    private JFrame makeFrame;

    public MakeAQuiz()
    {
        start = new JPanel(new CardLayout());
        start.add(makePanel(),"1");

        makeFrame = new JFrame();
        makeFrame.setSize(500,600);
        makeFrame.add(start);
        makeFrame.setVisible(true);
        makeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    }

    public JFrame getJFrame()
    {
        return makeFrame;
    }

    public JPanel makePanel()
    {
        question = new JPanel(new FlowLayout());
        fields = new JPanel(new GridBagLayout());
        buttonz = new JPanel(new FlowLayout());
        base = new JPanel(new BorderLayout());

        GridBagConstraints c = new GridBagConstraints();
        c.weighty=0.5; //adds padding between the fields vertically

        for (int i = 1; i<5; i++)
        {
            c.gridy++; //puts each field in a seperate line/row
            JLabel label = new JLabel(labels[i]);
//            c.fill = GridBagConstraints.HORIZONTAL;
            fields.add(label,c);
            JTextField textField = new JTextField(20);
            fields.add(textField,c); 
        }


        final CardLayout layout = (CardLayout)start.getLayout();    

        buttons[1].addActionListener(new ActionListener() {
//            @Override
            public void actionPerformed(ActionEvent e) {
                buttons[0].setEnabled(false);
                buttons[2].setEnabled(false);
//                for(Component comp : cardPanel.getComponents()) {
//                    if(comp instanceof Page) {
//                        Page page = (Page)comp;
//                        page.printData();
//                    }
//                }
            }
        });

        buttons[2].addActionListener(new ActionListener() 
        {
//        @Override
            public void actionPerformed(ActionEvent e) 
            {
                start.add(makePanel(), String.valueOf(start.getComponentCount() + 1));              
                layout.next(start);
            }
        });

        buttons[0].addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent e) 
            {           
                layout.previous(start);
            }
        });

        buttonz.add(buttons[0]);    
        buttonz.add(buttons[1]);
        buttonz.add(buttons[2]);   

        JLabel l = new JLabel(labels[0]);
        JTextField t = new JTextField(30);
        question.add(l);
        question.add(t);

        base.add(question,BorderLayout.NORTH);
        base.add(buttonz,BorderLayout.SOUTH);
        base.add(fields,BorderLayout.CENTER);

        return base;
    }

}
}

一旦我添加了一些额外的组件到start panel.

但是,您会遇到问题,因为您已将按钮添加到显示在CardLayout.

更好的解决方案是将按钮放在主屏幕底部并将其与卡片分开。

您需要维护某种计数器或对当前页面的引用,如CardLayout不提供任何方式来获取当前卡的引用。这将允许您适当地启用/禁用下一个/上一个按钮...

更新了可运行的示例...

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MakeAQuiz {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }
                new MakeAQuiz();
            }
        });
    }

    private JPanel start, base, fields, buttonz, question;
    private String[] labels = {"Enter your question: ", "Answer 1: ", "Answer 2: ", "Answer 3: ", "Answer 4: "};
    private JButton[] buttons = {new JButton("<<Go back"), new JButton("I'm done"), new JButton("Next>>")};
    private JFrame makeFrame;

    public MakeAQuiz() {
        start = new JPanel(new CardLayout());
        start.add(makePanel(), "1");

        makeFrame = new JFrame();
        makeFrame.add(start);

        buttonz = new JPanel(new FlowLayout());

        final CardLayout layout = (CardLayout) start.getLayout();

        buttons[1].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                buttons[0].setEnabled(false);
                buttons[2].setEnabled(false);
            }
        });

        buttons[2].addActionListener(new ActionListener() {
      @Override
            public void actionPerformed(ActionEvent e) {
                int count = start.getComponentCount();
                start.add(new JLabel(Integer.toString(count), JLabel.CENTER), Integer.toString(count));
                layout.next(start);
            }
        });

        buttons[0].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                layout.previous(start);
            }
        });

        buttonz.add(buttons[0]);
        buttonz.add(buttons[1]);
        buttonz.add(buttons[2]);

        makeFrame.add(buttonz, BorderLayout.SOUTH);

        makeFrame.pack();
        makeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        makeFrame.setVisible(true);
    }

    public JFrame getJFrame() {
        return makeFrame;
    }

    public JPanel makePanel() {
        question = new JPanel(new FlowLayout());
        fields = new JPanel(new GridBagLayout());
        base = new JPanel(new BorderLayout());

        GridBagConstraints c = new GridBagConstraints();
        c.weighty = 0.5; //adds padding between the fields vertically

        for (int i = 1; i < 5; i++) {
            c.gridy++; //puts each field in a seperate line/row
            JLabel label = new JLabel(labels[i]);
//            c.fill = GridBagConstraints.HORIZONTAL;
            fields.add(label, c);
            JTextField textField = new JTextField(20);
            fields.add(textField, c);
        }

        JLabel l = new JLabel(labels[0]);
        JTextField t = new JTextField(30);
        question.add(l);
        question.add(t);

        base.add(question, BorderLayout.NORTH);
        base.add(fields, BorderLayout.CENTER);

        return base;
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CardLayout之前的功能不起作用? 的相关文章

随机推荐

  • Mysql更改默认引擎

    如何将mysql引擎改为MYISAM 现在我有 INNODB 的 mysql 但我想将引擎更改为 MYISAM 我必须做什么 CREATE TABLE classifieds category id int 11 NOT NULL AUTO
  • laravel新建数据时无法按类别保存计算数据

    模型花费时间 在 laravel 中创建新数据时 无法按类别保存计算数据 public static function findOrCreate plan id data fromDate Carbon now gt subDay gt s
  • Android主项目与库项目-如何在项目之间传递设置

    刚刚开始使用 Android 我正在尝试创建一个具有免费和付费版本的应用程序 我也是 Java 新手 但我成功地在 Eclipse 中创建了一个简单的工作应用程序 它由 2 个主要项目组成 一个是免费版本 一个是付费版本 我还有一个库项目
  • 如何获取字符串中所有出现 Ruby 正则表达式的匹配数据?

    我需要MatchData对于字符串中正则表达式的每次出现 这与中建议的扫描方法不同匹配正则表达式的所有出现 因为这只给了我一个字符串数组 我需要完整的 MatchData 以获取开始和结束信息等 input abc12def34ghijkl
  • 在数据库中存储时间 (hh:mm) 的最佳方法

    我想将时间存储在数据库表中 但只需要存储小时和分钟 我知道我可以只使用 DATETIME 并忽略日期的其他组成部分 但是在不存储超出我实际需要的信息的情况下执行此操作的最佳方法是什么 您可以将其存储为午夜过后分钟数的整数 eg 0 00 0
  • 如果我包含某个包,Flutter Android 应用程序会在启动时崩溃

    最近突然出现了一个问题 只需将依赖项包含在 pubspec yaml 中的 位置 中 例如 dependencies flutter sdk flutter location 1 2 0 lt culprit firebase auth 0
  • 最短的GAS ARM (linux) 程序?

    我曾考虑过学习汇编语言 并决定尝试一下 ARM 我决定使用 GNU 汇编器 主要是因为它可以在我的手机存储库中找到 这样如果我感到无聊 我可以在任何地方尝试汇编 无论如何 我在网上搜索过 但找不到任何有关如何正确退出 ARM Linux 二
  • Java - 为什么强制垃圾收集不释放内存

    我正在生成一个大型数据结构并将其写入硬盘 之后我想摆脱该对象 以减少内存消耗 我的问题是 在强制垃圾收集之后 已用内存量至少与垃圾收集之前一样高 我添加了一个我正在做的最小工作示例 DataStructure data new DateSt
  • 在华为开发者控制台中为华为应用添加关键字

    我需要为用户提供在华为应用程序库中搜索我的应用程序的能力 就像苹果在应用程序商店中的关键字一样 但我在华为开发者控制台中找不到与之等效的内容 华为提供多种广告类型来帮助您增加Android应用的下载量 您可以设置字词或短语 使您的广告与用户
  • 如何将一个表单的实例传递给另一个表单

    我有一个名为form1带有在运行时创建的控件 当我按下表单上的按钮时 另一个表单会加载 称为combat and form1被隐藏 因此只有 1 种形式 combat 可见 当我按下按钮时combat我想要我的form1形成所显示的 但是我
  • jQuery 方法不适用于事件处理程序中的“this”

    当我使用下面的方法时 我无法获取 jQuerythis隐藏该元素 purplePanda click function e this hide 我收到此错误 Uncaught TypeError this hide is not a fun
  • 参数通过 ByVal 传递给 VB.NET 函数并在那里进行操作

    在此 Microsoft 示例中 将 Double 数组传递给函数MultiplyMatricesSequential and MultiplyMatricesParallel 作为参数结果使用ByVal修饰符 http msdn micr
  • Flutter:忽略小部件上的触摸事件

    我希望在其他小部件之上有一个模糊的图像 但是 当我这样做时 我无法与它下面的小部件进行交互 Solution 您可以解决您的交互问题 无法与Widget在你的模糊图像下方 通过包围你的BackdropFilter与IgnorePointer
  • 如何在支持8位无符号整数的设备上合法显示DICOM 16无符号整数?

    我正在 iOS 上开发一个医疗应用程序 iOS 设备仅支持 GL UNSIGNED BYTE 和 GL LUMINANCE 或者通常仅支持每个组件 8 位 现在我有一些灰度图像是 16 位无符号整数 我想显示它们 我发现我们无法显示 16
  • 使用any()和all()检查列表是否包含一组值或另一组值

    我的代码是针对井字游戏并检查平局状态的 但我认为这个问题在一般意义上可能更有用 我有一个代表董事会的列表 它看起来像这样 board 1 2 3 4 5 6 7 8 9 当玩家移动时 他们移动的整数将被替换为他们的标记 x 或 o 我已经进
  • Spring Security 中拦截 url 模式的顺序

    在 appSecurity xml 我有这个 拦截 url 模式 users profile 访问 hasRole VIEW PROFILES 拦截url模式 用户 个人资料 编辑 访问 hasRole EDIT PROFILES 我有一个
  • 在 PHP 中验证 XHTML5?

    背景 I have made the decision to serve my website as application xhtml xml to anyone who will accept it I understand that
  • 什么会导致此自定义 XML ModelBinder 无法反序列化我的 XML POST?

    该模型 public class SimpleUser public string FirstName get set public string LastName get set public string UserName get se
  • “composer”包管理器如何工作?

    我正在尝试安装 Krumo 它说有两种安装方法 我尝试了第一种方法 下载 PHP 文件并将其包含到我的项目中 效果很好 现在我正在尝试第二种方法 使用作曲家 当我看到它的时候 一堆问题就出现了 在哪里运行这个命令 是否相当于将 class
  • CardLayout之前的功能不起作用?

    我的卡片布局的下一个功能可以正常工作 但上一个功能却不能正常工作 就我而言 只需 layout previous 在我的 makePanel 方法的 actionPerformed 方法主体中应该可以工作 但是当我运行程序并单击上一个按钮时