繁体   English   中英

在Java Swing GUI中动态添加工具栏

[英]Dynamically adding toolbars in Java Swing GUI

我正在开发Java桌面应用程序。 我希望在GUI中,该用户可以动态添加任意数量的工具栏。 为了实现这一点,以下是我已经做过的事情:

  • 采取了mainPanel并将其布局设置为BorderLayout
  • 然后使用topPanel并将其添加到mainPanel的BorderLayout.NORTH中
  • 将topPanel的布局设置为BoxLayout
  • 然后以5个面板命名为toolbar1Panel,toolbar2Panel,...。
  • 之后,在前面步骤中创建的每个toolbarPanel中都添加了一个工具栏。
  • 仅添加了一个toolbarPanel,即topPanel上的toolbar1Panel

现在,第一个工具栏上有一个名为“添加”的按钮,该按钮添加在“ toolbar1Panel”上,该按钮又添加到topPanel中。

现在,我已经实现了上述“添加”按钮的“ actionPerformed()”方法,如下所示:

// to add second toolbar Panel to the topPanel dynamically
topPanel.add(toolbar2Panel);  

但是问题是它不起作用。 意味着没有工具栏添加到topPanel。

有什么我想念的吗?

该代码是Netbeans生成的,因此我认为它只会给其他人增加混乱,这就是为什么我没有在此处粘贴任何代码的原因。

在将另一个工具栏添加到BoxLayout之后,您可能需要(重新登录)验证面板。

我已经反复做过,但是我不理解3个左右方法调用背后的逻辑。 因此,我只尝试它们,直到找到了可行的方法:

topPanel.validate();
topPanel.invalidate();
topPanel.revalidate();
topPanel.layout();

(至少)其中之一应强制您的GUI重新计算其布局,使北面板更大,从而显示您添加的第二个(及后续)工具栏。

如果未指定顶部面板的布局,则可能是假设面板布局不正确。

向其中添加两个工具栏面板可能只是将第一个替换为第二个,或者忽略了第二个。

仅出于测试目的,将topPanel的布局设置为FlowLayout,然后重试。

我认为您在测试之前尝试做太多事情。 我采用的方法是从非常简单的内容开始,例如一个面板,一个静态标签。 如预期的那样,在出现时添加带有菜单项的工具栏。 那样有用吗。 然后逐步添加片段。

您很可能会遇到一个简单案例的问题,然后就可以解决,或者您可以在此处发布一个简单案例。

或者,作为起点,从网上挑选一些可行的例子。 削减它,然后建立您的情况。

有帮助吗? 这是您想要实现的目标吗?

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

public class AddingToolbars {
    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable(){

            public void run() {
                AddingToolbars me = new AddingToolbars();
                me.initGui();

            }

        });

    }

    private JPanel topPanel;
    private JPanel mainPanel;
    private JFrame frame;

    private void initGui() {
        frame = new JFrame();

        mainPanel = new JPanel(new BorderLayout());
        frame.setContentPane(mainPanel);

        topPanel = new JPanel();
        BoxLayout bLayout = new BoxLayout(topPanel,BoxLayout.Y_AXIS);
        topPanel.setLayout(bLayout);
        mainPanel.add(topPanel,BorderLayout.NORTH);

        JButton addButton = new JButton("Add toolbar");
        mainPanel.add(addButton,BorderLayout.CENTER);

        addButton.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                addNewToolBar();
            }

        });

        frame.setSize(500,500);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }

    protected void addNewToolBar() {
        JToolBar tb = new JToolBar();
        tb.add(new JButton("b1"));
        tb.add(new JButton("b2"));
        tb.add(new JButton("b3"));

        topPanel.add(tb);
        mainPanel.validate();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM