2014-01-30 228 views
1
添加共享按钮

大家好,我一直用这个作为我的指导和我的代码基础,我一直在努力:跨越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的不能共享。所以现在我在这里结束。当我看看为什么我收到这个错误时,有人能告诉我这是否正确吗?

回答

2

建议:

  • 考虑将一个JButton在一个JPanel是低于或JTabbedPane的上方,使得它始终是可见的,而你只需要一个按钮。
  • 或者,如果它必须位于标签中的组件中,那么每个标签都需要它自己的独特JButton,但它们可以共享相同的Action,这是我建议你做的:创建一个扩展AbstractAction的内部私有类,创建这个内部类的一个实例,通过JButton的构造函数或其方法将它传递给每个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)); 
+0

谢谢你,你的最终选择做的伎俩。提到BoxLayout的原因是,因为这是我试图解决这个问题。它还展示了我试图在物理上实现的布局。我喜欢总是展示我所采取的路线。这可以导致我想要做的更好的想法和/或讨论为什么它可能不是最好的方法。感谢3个选项。我要走3号门:D。 – whitewolfpgh

+0

我仍然是gui等的新手,并且在一年之内没有碰到过java。最后,有动力回到它。感谢关于构造函数和getContentPane()的提醒,这是我以前忽略的内容,并且确实需要提交内存。 – whitewolfpgh

+0

@whitewolfpgh:不客气,很高兴帮助。 –