简体   繁体   English

Java(摇摆)工具栏未显示

[英]Java (swing) toolbar not showing

I have been following this tutorial: 我一直在关注本教程:
Java toolbar tutorial Java工具栏教程
However when I tried to insert a toolbar into the GUI, it doesn't show up. 但是,当我尝试将工具栏插入GUI时,它没有显示。 Can someone kindly give me advice on what to do? 有人可以给我一些建议吗? The code so far is this: 到目前为止的代码是这样的:

import javax.swing.Box;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.AbstractAction;
import static javax.swing.Action.MNEMONIC_KEY;
import static javax.swing.Action.SMALL_ICON;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.KeyStroke;
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.BorderFactory;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JLabel;
import javax.swing.JToolBar;

public class gui extends JFrame {

private JLabel statusbar;

public gui() {

    initUI();
}

private void initUI() { 

    createMenuBar();
    createToolBar();

    statusbar = new JLabel("Ready");
    statusbar.setBorder

 (BorderFactory.createEtchedBorder());
  add(statusbar, BorderLayout.SOUTH);

    JButton quitButton = new JButton("Quit");
    quitButton.setToolTipText("A button component");

    quitButton.addActionListener(new ActionListener() 

{
        @Override
        public void actionPerformed(ActionEvent event) 

{
            System.exit(0);
        }
    });

    quitButton.setMnemonic(KeyEvent.VK_B);

    createLayout(quitButton);

    setTitle("Typing Tutor");
    setSize(360, 250);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

private void createMenuBar() {

    JMenuBar menubar = new JMenuBar();

    ImageIcon iconNew = new ImageIcon("new.png");
    ImageIcon iconOpen = new ImageIcon("open.png");
    ImageIcon iconSave = new ImageIcon("save.png");
    ImageIcon iconExit = new ImageIcon("exit.png");

    JMenu fileMenu = new JMenu("File");
    fileMenu.setMnemonic(KeyEvent.VK_F);

    // Old code 

    JMenu impMenu = new JMenu("Import");
    fileMenu.setMnemonic(KeyEvent.VK_I);

    JMenuItem newsfMi = new JMenuItem("Import newsfeed list...");
    JMenuItem bookmMi = new JMenuItem("Import bookmarks...");
    JMenuItem mailMi = new JMenuItem("Import mail...");

    impMenu.add(newsfMi);
    impMenu.add(bookmMi);
    impMenu.add(mailMi);

    JMenuItem newMi = new JMenuItem("New", iconNew);
    JMenuItem openMi = new JMenuItem("Open", iconOpen);
    JMenuItem saveMi = new JMenuItem("Save", iconSave);

    JMenuItem exitMi = new JMenuItem("Exit", iconExit);
    exitMi.setMnemonic(KeyEvent.VK_E);
    exitMi.setToolTipText("Exit application");
    exitMi.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) 

    {
                System.exit(0);
            }
        });

        // New code

        JMenu viewMenu = new JMenu("View");
        viewMenu.setMnemonic(KeyEvent.VK_V);

        JCheckBoxMenuItem sbarMi = new JCheckBoxMenuItem

("Show status bar");
        sbarMi.setMnemonic(KeyEvent.VK_S);
        sbarMi.setDisplayedMnemonicIndex(5);
        sbarMi.setSelected(true);

        sbarMi.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {

                if (e.getStateChange() == 

ItemEvent.SELECTED) {
                    statusbar.setVisible(true);
                } else {
                    statusbar.setVisible(false);
                }

            }

        });

        // Newer code
        JMenu helpMenu = new JMenu("Help");


        viewMenu.add(sbarMi);
        fileMenu.add(newMi);
        fileMenu.add(openMi);
        fileMenu.add(saveMi);
        fileMenu.addSeparator();
        fileMenu.add(impMenu);
        fileMenu.addSeparator();
        fileMenu.add(exitMi);


        menubar.add(fileMenu);
        menubar.add(viewMenu);
        menubar.add(Box.createHorizontalGlue());
        menubar.add(helpMenu);

        setJMenuBar(menubar);
    }

 private void createToolBar() {

        JToolBar toolbar = new JToolBar();

        ImageIcon icon = new ImageIcon("exit.png");

        JButton exitButton = new JButton(icon);
        toolbar.add(exitButton);

        exitButton.addActionListener(new ActionListener() 

{
            @Override
            public void actionPerformed(ActionEvent event) 

{
                System.exit(0);
            }
        });

        add(toolbar, BorderLayout.NORTH);        
    }

    private void createLayout(JComponent... arg) {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);

        gl.setHorizontalGroup(gl.createSequentialGroup()
                .addComponent(arg[0])
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(arg[0])
        );

        pack();
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                gui ex = new gui();
                ex.setVisible(true);
            }
        });
    }
}

I also checked stackoverflow and google searches but I the ones I've seen were either for android and/or I can understand. 我也检查了stackoverflow和google搜索,但是我所看到的要么是针对android的,要么是我可以理解的。 Some advice would be greatly appreciated. 一些建议将不胜感激。 Thank you. 谢谢。

You've changed the layout AFTER creating and adding the JToolBar (to GroupLayout - don't get me started on that choice) 创建并添加JToolBar之后,您已经更改了布局(添加到GroupLayout不要让我开始选择该选项)

So, if we change createLayout so it creates a secondary component, something like... 因此,如果我们更改createLayout以便创建辅助组件,则类似...

private void createLayout(JComponent... arg) {

    JPanel pane = new JPanel();
    //Container pane = getContentPane();
    GroupLayout gl = new GroupLayout(pane);
    pane.setLayout(gl);

    gl.setAutoCreateContainerGaps(true);

    gl.setHorizontalGroup(gl.createSequentialGroup()
                    .addComponent(arg[0])
    );

    gl.setVerticalGroup(gl.createSequentialGroup()
                    .addComponent(arg[0])
    );

    add(pane);

    pack();
}

It will now display something like... 现在它将显示类似...

帧

Because both your content AND the JToolBar need to live in contentPane , you need to be concious of any changes you make to it. 因为您的内容和JToolBar需要存在于contentPane ,所以您需要注意对其所做的任何更改。 This solution makes a secondary pane, onto which you "main" content can be placed, in what ever manner you want, but which is then added to the contentPane which is still using a BorderLayout 此解决方案创建了一个辅助窗格,可以按照您想要的任何方式在其上放置“主要”内容,然后将其添加到仍使用BorderLayoutcontentPane

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

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