【问题标题】:Add a shared button across JTabbedPane在 JTabbedPane 中添加共享按钮
【发布时间】:2014-01-30 19:13:04
【问题描述】:

大家好,我一直使用它作为我的指南和我一直在编写的代码的基础:

Java Source

我想做的是在所有窗格中添加一个共享按钮。我不想为每个按钮声明一个唯一的按钮,而是一个共享的按钮。我的第一个想法是将框架更改为 boxlayout,然后在将窗格添加到框架后添加一个按钮:

    private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BoxLayout(frame, BoxLayout.PAGE_AXIS));

    //Add content to the window.
    //frame.add(new GUI(), BorderLayout.CENTER);
    frame.add(new GUI());

    //setup Find button
    //findButton.setSize(110,55);
    findButton.setText("Find"); 
    findButton.setVisible(true);

    //add button to frame
    frame.add(findButton);

但是,我收到运行时错误:无法共享 BoxLayout。所以现在我在这里结束。在我调查为什么会出现此错误时,有人可以告诉我这是否是正确的方法吗?

【问题讨论】:

    标签: java swing jbutton frame jtabbedpane


    【解决方案1】:

    建议:

    • 考虑将 JButton 放置在 JTabbedPane 下方或上方的 JPanel 中,以便它始终可见,并且您只需要一个按钮。
    • 或者,如果它必须位于选项卡中的组件中,则每个都需要自己唯一的 JButton,但它们可以共享相同的 Action,我建议您这样做:创建一个扩展 AbstractAction 的内部私有类,创建此内部类的实例,通过 JButton 的构造函数或其setAction(...) 方法将其传递给每个 JButton。
    • 您的 BoxLayout 问题与您的原始问题完全无关,甚至不应该成为本次讨论的一部分。是的,BoxLayout 必须在一个容器中使用,并且应该将同一个容器传递到 BoxLayout。您可能会将其添加到 JFrame,但实际上这会将其添加到 JFrame 的 contentPane,因此要使其正常工作,您必须将 frame.getContentPane() 传递给 BoxLayout 的第一个构造函数参数:

    frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
    

    这是我不喜欢直接在顶层窗口添加组件或设置布局的原因之一,因为它只不过是误导性的语法糖。

    我更喜欢:

    JPanel contentPane = (JPanel) frame.getContentPane();
    contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS));
    

    【讨论】:

    • 谢谢,您的最终选择成功了。提到 BoxLayout 的原因是,因为那是我解决问题的尝试。它还演示了我试图在物理上实现的布局。我也喜欢总是展示我所走的路线。这可以让我更好地了解我正在尝试做什么和/或讨论为什么它可能不是最好的方法。感谢您的 3 个选项。我要去 3 号门:D。
    • 我还是 gui 等的新手,一年多没有接触过 java。最后,有动力回到它。感谢关于构造函数和 getContentPane() 的提醒,这是我之前忽略的,确实需要记忆。
    • 我使用了你的方法,使用了一个 JPanel,里面有一个 JButton,然后也将面板添加到框架中。两者在视觉上似乎都在做同样的事情。哪个更好?为什么?
    • @whitewolfpgh:请再次描述选项 1?
    • 选项1:新面板,添加按钮,添加到框架
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多