Java如何在不破坏布局的情况下将menuBar添加到JFrame

rqdpfwrv  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(153)

我需要一些帮助来添加一个menuBar到我的JFrame。我有我的GUI类:

public class Gui extends JFrame implements KeyListener {
        private PanelMiniMap map;
    private CardLayout cardLayout = new CardLayout();

    private JPanel cards;

    public Gui() {
        this.setSize(1000, 800);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);// center
        this.setResizable(false);

        // bauen();
        this.cards = new JPanel(cardLayout);

        

        this.addListener();
        this.add(cards);

        this.setVisible(true);

    }

    public void addListener() {
        this.addKeyListener(this);
    }

    public void addPanelZuCards(PanelSpielfeld spielfeld, PanelCharakterErschaffung charerschaffung, PanelMiniMap map) {

        this.map = map;

        this.cards.add(charerschaffung, "charerschaffung");
        this.cards.add(spielfeld, "spielfeld");
    }

    public Dimension getDimension() {
        return new Dimension(this.getWidth(), this.getHeight());
    }

    /**
     * Neue Charaktererschaffung ausgeben
     * 
     * @param charerschaffung
     *            Das Panel, auf dem die Oberflaeche zur Charaktererschaffung
     *            erstellt wird
     */
    public void zeigeCharckterPanel() {
        this.cardLayout.show(cards, "charerschaffung");
    }

    public void zeigeSpielPanel() {
        this.cardLayout.show(cards, "spielfeld");
        this.requestFocus();

    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            map.move(-1, 0);
            map.repaint();
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            map.move(1, 0);
            map.repaint();
        }
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            map.move(0, -1);
            map.repaint();
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            map.move(0, 1);
            map.repaint();

        }
    }

}

在这里,我将我的2个JPanel(PanelSpielfeld,PanelCharakterErschaffung))添加到我的GUI中,它像这样锁定:

和另一张卡,这是相同的原则,我按下“开始!”按钮后显示另一张卡:

因此,如果我在Jframe中添加一个menuBar:

public Gui() {
        this.setSize(1000, 800);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);// center
        this.setResizable(false);

        // bauen();
        this.cards = new JPanel(cardLayout);
            
        JMenuBar menuBar;
        JMenu menu;
        JMenuItem menuItem;

        menuBar = new JMenuBar();

        menu = new JMenu("A Menu");
        menuItem = new JMenuItem("testitem");

        menu.add(menuItem);
        menuItem = new JMenuItem("3214dx");
        menu.add(menuItem);
        menuItem = new JMenuItem("dwq213m");
        menu.add(menuItem);
        menuBar.add(menu);
        this.add(menuBar);
        
        this.addListener();     
        this.add(cards);
        
        this.setVisible(true);
        this.addWindowFocusListener(this);
    }

什么都没有发生,我真的不明白为什么。我做错了什么,或者我应该做什么,在两个“卡”上有相同的菜单栏?

**编辑:**我改了

this.add(menuBar)

致:

this.setJMenuBar(menuBar);

现在它像这样锁定:

我仍然缺少一些东西。我必须为JFrame设置一个特定的LayoutManager吗?

oxf4rvwz

oxf4rvwz1#

好吧,我很抱歉浪费了你的时间(谁读过这篇文章)。我的2个JPanles设置为框架首选的大小,所以问题是,菜单栏tock的空间,2面板需要,这是破坏我的图形用户界面。
如果我将2个JPanel的大小设置为frame.height -50,则它可以工作:

相关问题