在JTabbedPane上添加一个共享按钮

时间:2014-01-30 19:13:05

标签: java swing jbutton frame jtabbedpane

嘿大家我一直用它作为我的指南,也是我一直在努力的代码基础:

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。所以现在我结束了。当我调查为什么我收到此错误时,如果这是正确的方法,有人可以告诉我吗?

1 个答案:

答案 0 :(得分:2)

建议:

  • 考虑将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));