如何在显示JTabbedPane后隐藏它?

时间:2013-03-04 20:51:10

标签: java swing jtabbedpane

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

我以前做过的事情似乎完全一样,虽然这次它没有用。我尝试使用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)将无法显示它们,但如果我希望在不重新启动应用程序的情况下完成此操作,则无效。

1 个答案:

答案 0 :(得分:3)

查看你的getUtilityTabs函数,无论是什么utilityTabs,你都将返回一个新的UtilityTabs。因此,设置新的utilityTabs的可见性对您已创建的那个没有任何作用。

这应该解决它:

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