【问题标题】:Multiple JButtons多个 JButton
【发布时间】:2011-08-24 13:52:52
【问题描述】:

鉴于我有一个可以添加到不同面板的按钮,我可以说实例化 1 个 JButton 是不可能的吗?

示例:添加“取消”按钮以退出应用程序并将其添加到具有一定数量选项卡的选项卡窗格中。

我可以吗

JButton btnCancel = new JButton("Cancel");

在 JFrame 的第一个选项卡的 JPanel 中 tab1.add(btnCancel);

第二个标签 tab2.add(btnCancel);

或者我必须为每个选项卡窗格创建一个新的 JButton?

【问题讨论】:

    标签: java swing


    【解决方案1】:

    ..我怎样才能使按钮不会创建新标签?

    使用嵌套布局。例如

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.TitledBorder;
    
    class CancelTab {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater( new Runnable() {
                public void run() {
                    JPanel gui = new JPanel(new BorderLayout(3,3));
                    gui.setBorder(new TitledBorder("GUI"));
                    JPanel controls = new JPanel(
                        new FlowLayout(FlowLayout.CENTER,5,5));
                    controls.add(new JButton("Commit"));
                    controls.add(new JButton("Cancel"));
    
                    gui.add(controls,BorderLayout.SOUTH);
    
                    JTabbedPane tabbedPane = new JTabbedPane();
    
                    tabbedPane.addTab("Tab 1", new JLabel("Label 1"));
                    tabbedPane.addTab("Tab 2", new JLabel("Label 2"));
                    gui.add(tabbedPane, BorderLayout.CENTER);
    
                    JOptionPane.showMessageDialog(null, gui);
                }
            });
        }
    }
    

    屏幕截图

    【讨论】:

    • 是的,这就是我想要做的,但我用按钮面板将按钮添加到我的 JFrame,这仍然是一样的权利
    • 基本上是的。我更喜欢使用JPanel 有两个原因。 1)您可以在构造函数中显式设置布局(AFAIR 内容窗格的默认布局在 1.4 或 1.5 左右更改) 2)如果您需要添加边框,则无需转换为 JComponent
    • 在这种情况下为JPanel +1;它还为您提供双缓冲和合适的 UI 委托。
    • @trashgod:为我的无知道歉,但我不明白您所说的“UI 代表”是什么意思。你能扩展一下“代表”吗?
    • 我总是很高兴教皇!对于JPanel,它是PanelUI。例如,我的默认为cpm.apple.laf.AquaPanelUI。更多内容在A Swing Architecture Overview.
    【解决方案2】:

    jleedev 解决方案是最好的 (1+),但是如果您绝对需要将它添加到每个 JPanel,那么您可以创建一个使用按钮文本构造的 AbstractAction 并使用这个相同的 AbstractAction 创建新的 JButton,或者您可以创建一个单一的 ButtonModel,由具有相同名称和操作的所有 JButton 共享。

    【讨论】:

    • +1 表示Action;另见example
    【解决方案3】:

    如果您计划让按钮不起作用,这将起作用。 但是,如果您计划向对象添加任何侦听器,那么执行任何任务都不是一个好的选择。 但是,如果您要在执行操作时获取按钮的父容器并相应地执行任务,它可能会起作用。

    但无论哪种方式,为每次使用创建一个新的 JButton 都会更有效和合乎逻辑。

    【讨论】:

      【解决方案4】:

      将它放在选项卡窗格下方。所以你的层次结构看起来像这样:

      • JFrame
        • JTabbedPane
          • 标签 1 的 JPanel
          • 用于选项卡 2 的 JPanel 等
        • JButton 取消

      【讨论】:

      • 我刚试过,但它会自己添加一个带有按钮的标签,我怎样才能使按钮不会成为新标签?
      • @kyrogue:您的陈述非常需要澄清。
      • 找到了我正在尝试做的事情的解决方案 Container pane = myFrame.getContentPane(); pane.add(buttons,BorderLayout.PAGE_END); myFrame.add(tab);
      猜你喜欢
      • 2014-04-20
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多