java - JTabbedPane 显示后如何隐藏它?

标签 java swing jtabbedpane

我最近重新编写了很多应用程序,在我这样做之前,我想要完成的工作效果很好。我试图通过 JMenuBar 中的 JCheckBoxMenuItem 按需隐藏 JTabbedPane

我之前所做的似乎完全一样,尽管这次不起作用。我尝试过使用 invokeLater(...) 但无济于事。

这是我正在使用的基本示例:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class ToolkitFrame extends JFrame {

    private static final long serialVersionUID = -6757985823719418526L;

    public static void main(String[] args) {
        new ToolkitFrame().construct();
    }

    private UtilityTabs utilityTabs;

    public UtilityTabs getUtilityTabs() {
        if (utilityTabs == null) {
            utilityTabs = new UtilityTabs();
        }
        return new UtilityTabs();
    }

    public ToolkitFrame() {
        super();
    }

    public void construct() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(getGameScreen(), BorderLayout.CENTER);
        add(getUtilityTabs().getTabs(), BorderLayout.EAST);
        setJMenuBar(getJMenuBar());
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public JMenuBar getJMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        JMenu viewMenu = new JMenu("View");
        final JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem("Show Utilities");
        checkbox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                getUtilityTabs().getTabs().setVisible(checkbox.isSelected());
                System.out.println("Tabs should be: " + (checkbox.isSelected() ? "visible" : "hidden"));
            }

        });
        checkbox.setSelected(true);

        viewMenu.add(checkbox);

        menuBar.add(viewMenu);

        return menuBar;
    }

    public JPanel getGameScreen() {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(765, 503));
        panel.setBackground(Color.BLACK);
        return panel;
    }

    class UtilityTabs {

        private JTabbedPane tabs;

        public JTabbedPane getTabs() {
            return tabs;
        }

        private Tab tab;

        public Tab getTab() {
            if (tab == null) {
                tab = new Tab();
            }
            return tab;
        }

        public UtilityTabs() {
            tabs = new JTabbedPane(JTabbedPane.TOP);
            tabs.setPreferredSize(new Dimension(275, 503));
            tabs.add("FooBar", getTab());
            tabs.setVisible(true);
        }

        class Tab extends JPanel {

            private static final long serialVersionUID = 677183279827434278L;

            private DefaultListModel<String> listModel;

            private JList<String> list;

            public Tab() {
                construct();
            }

            public void construct() {
                listModel = new DefaultListModel<String>();
                for (String name : new String[] { "foo", "bar" }) {
                    listModel.addElement(name);
                }
                list = new JList<String>(listModel);
                add(new JScrollPane(list));
            }

        }

    }

}

谁能告诉我我做错了什么?我基本上希望根据用户设置显示或隐藏游戏的实用程序(无需重新启动)。

使用 setVisible(false) 不会显示它们,但如果我希望在不重新启动应用程序的情况下完成它,这没有帮助。

最佳答案

看看你的 getUtilityTabs 函数,无论 utilityTabs 是什么,你总是会返回一个新的 UtilityTabs。因此,设置新 utilityTabs 的可见性对您已创建的实用程序选项卡没有任何作用。

这应该可以修复它:

    public UtilityTabs getUtilityTabs() {
    if (utilityTabs == null) {
        utilityTabs = new UtilityTabs();
    }
    return utilityTabs;
}

关于java - JTabbedPane 显示后如何隐藏它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15210888/

相关文章:

java - DialogFragment 作为 Fragment 内的内部类(支持库 Fragment v4)

java - 使用布局管理器将选项卡式 Pane 添加到面板

java - 初始化后更新选项卡内容

java - 开发用户界面的最佳 Java 框架是什么?

java - 如何将滚动 Pane 动态添加到 Swing java 中的选项卡式 Pane 中

java - 简单的 smack jabber 程序需要很长时间才能在 android 上连接

javascript - 如何在 Spring Boot 中的提交表单中将变量传递给 Controller ​​?

java - "[Fatal Error] :1:120: The processing instruction target matching "[xX][mM][lL] "is not allowed."

java - 将 JTextField 中的整数加一

java - 如何减慢java中特定方法的执行速度