在cardlayout中切换卡片后运行方法

2023-12-02

我确信以前有人问过这个问题,但我的谷歌今天不强。

我有一个使用 CardLayout 作为其管理器的 JFrame。当我在不使用开关的情况下切换到每个 JPanel 时,如何运行“Start”方法?

我用来将框架添加到布局的代码是:

/**
 * Adds JPanels to the Card Layout.
 * @param panel is the JPanel to add to the layout.
 * @param windowName is the identifier used to recognise the Panel.
 */
 public final void addToCards(final JPanel panel, final WindowNames windowName) {
     view.getBasePanel().add(panel, windowName.getValue());
 }

我用来切换布局的代码是:

/**
 * Method to change the JPanel currently visible on the BasePanel.
 * @param windowName is the name of the JPanel to change to.
 */
 public final void changePanel(final WindowNames windowName) {
    view.getCardLayout().show(view.getBasePanel(), windowName.getValue());
 }

目前我有一个 ActionListener 设置将调用切换代码,但我无法弄清楚如何在它将切换到的屏幕中调用“Start”方法。

我为每个 JPanel 设置了一个界面,以便每个 JPanel 中的方法名称都相同。


你可以只使用一个组件监听器对于面板。当面板成为 CardLayout 的视图时,它将触发一个组件事件并由componentShown在您的侦听器中(以及从视图中取出的面板),处理componentHidden)。致电您的start()方法那里。这样你就不必显式调用start()当面板发生变化时,它会被调用。

See 如何编写组件监听器更多细节。

这是一个简单的例子。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main {

    private static final String PANEL_A = "panelA";
    private static final String PANEL_B = "panelB";

    CardLayout layout = new CardLayout();
    JPanel panel = new JPanel(layout);
    ComponentListenerPanel p1 = new ComponentListenerPanel(PANEL_A);
    ComponentListenerPanel p2 = new ComponentListenerPanel(PANEL_B);
    JButton b1 = new JButton(PANEL_A);
    JButton b2 = new JButton(PANEL_B);

    public Main() {
        panel.add(p1, PANEL_A);
        panel.add(p2, PANEL_B);

        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                show(PANEL_A);
            }
        });
        b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                show(PANEL_B);
            }
        });
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(b1);
        buttonPanel.add(b2);

        JFrame frame = new JFrame();
        frame.add(panel);
        frame.add(buttonPanel, BorderLayout.PAGE_END);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public void show(String panelName) {
        layout.show(panel, panelName);
    }

    private class ComponentListenerPanel extends JPanel {
        private String panelName;

        public ComponentListenerPanel(String panelName) {
            this.panelName = panelName;
            addComponentListener(new ComponentAdapter() {
                @Override
                public void componentHidden(ComponentEvent evt) {
                    stop();
                }
                @Override
                public void componentShown(ComponentEvent evt) {
                    start();
                }
            });
        }

        public void start() {
            System.out.println(panelName + " started");
        }

        public void stop() {
            System.out.println(panelName + " stopped");
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 300);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Main();
            }
        });
    }
}

请注意,您实际上并没有说出启动方法在哪里is,所以这个代码/答案只是假设您在自定义面板中有一些启动方法。希望我猜对了。将来,甚至现在,您应该始终发布MCVE这样我们就不必进行所有这些猜测。

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

在cardlayout中切换卡片后运行方法 的相关文章

随机推荐

  • selenium webdriver C# 多线程

    Selenium WebDriver 支持多线程吗 我尝试在打开 2 4 个窗口的情况下使用它 看起来浏览器窗口 Firefox 有时会被冻结 当一个线程启动时 driver FindElement By Id id SendKeys My
  • Django 复杂注释

    先决条件 查询集必须返回Articles 查询集必须返回唯一的对象 不得使用访问数据库的 for 循环 意味着对要注释的 N 个对象进行 N 个查询 我的模型 class Report BaseModel ios report JSONFi
  • 是否可以在 Node.js 上使用 UDP 来保证消息的传递?

    如何在 Node js 上使用 UDP 保证消息的传递 例如 如果数据包失败 我可以重新发送数据包 但有没有办法识别它何时失败 另外 数据包丢失有多常见 如果您真正想知道的是 如何检测丢失的数据包 那么一般的技术是让接收方对发送的每个数据包
  • ng-options 在另一个下拉列表中按值过滤

    这似乎是一个非常简单的代码 但我无法弄清楚为什么它不起作用 我想按所选的 品牌 过滤 型号 下拉列表 Make
  • 如何在 webview 组件中检索 Javascript 函数值

    如何从 webview 组件中加载的网页中检索 Javascript 函数值 你不能直接 您可以通过以下方式调用 Javascript 函数loadUrl javascript where 是你的函数调用 但是 您无法通过这种方式得到结果
  • 从 API 网关调用时,Cloudwatch Logs PutLogEvents 操作失败,并出现 com.amazon.coral.service#UnknownOperationException

    我使用 API Gateway 的 AWS 服务集成类型通过 PutLogEvents 操作将日志添加到 Cloudwatch Logs 服务 如下所述 https docs aws amazon com AmazonCloudWatchL
  • 为什么在将临时变量传递给线程函数时移动构造函数会被调用两次? [复制]

    这个问题在这里已经有答案了 在下面的代码中 我无法理解为什么类的移动构造函数被调用两次 因为我的线程函数通过右值引用获取参数 所以我希望当参数移动到线程构造函数时 移动构造函数只会被调用一次 有人可以给出关于线程构造函数如何工作以及如何将参
  • linux 杀死命令 -9 与 -15

    我有一个进程想要终止然后重新启动服务 有人编写了通过编写以下脚本集来终止进程的代码 ps ef grep process name awk print kill 15 2 gt projects test kill sh run the k
  • 控制守护进程和应用程序的差异

    关于这篇优秀的文章 nohup 和守护进程有什么区别 我想问以下问题 从我的终端启动应用程序后 该应用程序会在后台或前台继续运行 我唯一能与之交互的就是从我的终端向其发送信号 假设标准输入仍然存在 然而 在启动守护进程后 我意识到可以通过其
  • 使用 shape-outside 包裹图像时如何将图像与文本底部对齐

    我一直在玩弄 shape outside 并在这里工作了一个示例 http www thelionscall com wp content Temp wrap test html element shape outside url http
  • XMLRPC 显示 -32601 错误(使用 PHP)

    我有以下代码
  • 使用 OpenCV 的 Heroku NodeJS 应用

    我尝试了很多构建包并在 google 上搜索了很多文章 但我就是无法部署我的 NodeJS 应用程序 所有构建包都已过时 2 年以上 而且都不起作用 到目前为止 我尝试了以下构建包 https github com zachlatta he
  • 增加 WordPress 的最大上传限制

    我需要将 PDF 文件上传到我的WordPress 网站 当我去上传新媒体 然后尝试上传它 它说 FileName pdf 超出了该网站的最大上传大小 我尝试查找 php ini 文件 但找不到它 我跑了phpinfo 通过创建一个新文件
  • 如何读取 MIT/GNU 方案中的文本文件?

    我一直在学习 SICP 我想应用我迄今为止学到的一些概念 也就是说 积累 映射和过滤将帮助我提高工作效率 我主要使用 CSV 文件 并且我知道 MIT GNU 方案不支持这种文件格式 但这没关系 因为我可以将 CSV 文件导出到 txt 文
  • 如何在sql server中将字符串转换为查询

    如何添加包含 And 子句的字符串 但是当我们应用查询该字符串时 该字符串将被视为查询并满足所有和条件我有一个查询 例如 Declare WhereQuery varchar max SET WhereQuery class BCA and
  • 如何跳过 XML 反序列化中引发错误的对象?

    我正在对非常大的 XML 文档 有时超过 200MB 使用 XML 反序列化 大多数文档都运行得很好 但有时反序列化函数会抛出错误 例如 当整数是字符串时 您会收到 格式错误 当无法识别指定的类型时 您会收到错误 Input string
  • 如何在dust.js中实现自定义渲染逻辑?

    我使用dust js 来呈现变量名称列表 这些名称有时很长并且包含下划线 例如 SUM COUNT LABOR COUNTRIES SMS PAST 浏览器不会用下划线换行 因此它会变得难看 我希望我的灰尘模板在每个下划线后添加一个零宽度的
  • 简单的 OpenGL GUI 框架用户交互建议? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我正在从头开始设计一个简单的 GUI 框架作为一个项目 使用 OpenGL 没有任何其他外部东西 并且需要一些关于如何实现用户交互的建议 基本上 我有一个基类GUIItem所有元素都继承自
  • 快速合并/连接两个表linux命令行

    假设我有两个相对较大的制表符分隔文件 file1 txt file2 txt file1 txt id tcity tcar ttype tmodel file2 txt id tname trating 让我们假设 file1 txt 有
  • 在cardlayout中切换卡片后运行方法

    我确信以前有人问过这个问题 但我的谷歌今天不强 我有一个使用 CardLayout 作为其管理器的 JFrame 当我在不使用开关的情况下切换到每个 JPanel 时 如何运行 Start 方法 我用来将框架添加到布局的代码是 Adds J