Можно ли переместить JMenuBar, не добавляя его в JPanel

У меня возникла проблема с расположением JMenuBar в моем приложении Java.

На самом деле я использую код ComponentResizer.java из статьи.

и все с изменением размера работает нормально, за исключением северной области моего приложения (неукрашенный JFrame) и его углов (северной области), потому что JMenuBar не позволяет мне изменять размер этой области.

Есть ли решение или, может быть, хак, чтобы немного переместить JMenuBar вниз или включить изменение размера в северной части?

Я также использую метод setJMenuBar(), чтобы добавить JMenuBar в северную часть моего приложения.

Код:

  public class MyApp extends JFrame {

private MyApp frame;
private JMenuBar menuBar;

public static void main(String[] args) {
    frame = new MyApp();
    frame.setUndecorated(true);
    frame.setVisible(true);
}
public MyApp(){
    initComponents();
}
private void initComponents(){
    setTitle("MediaForm");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 673, 482);
    menuBar = new JMenuBar();
    setJMenuBar(menuBar);
}
}

person PeGiannOS    schedule 06.09.2012    source источник
comment
Измените свой вопрос, включив в него sscce, который указывает на описанную вами проблему. Нет необходимости повторять ComponentResizer.   -  person trashgod    schedule 07.09.2012


Ответы (2)


JMenuBar расширяет JComponent, поэтому вы можете поместить его в любое место, куда бы вы поместили обычный компонент. Обратите внимание, что это может сбить пользователей с толку, если вы поместите его в неожиданные места.

Также см. это: добавить JMenuBar в JPanel?

person lbalazscs    schedule 06.09.2012
comment
Как я могу удалить JMenuBar из JFrame, чтобы добавить новую Jpanel, а затем добавить JMenuBar над ним, не теряя его содержимого - person PeGiannOS; 07.09.2012
comment
Я на самом деле сделал это сам. Спасибо за помощь. Это действительно помогло мне. - person PeGiannOS; 07.09.2012

Я не проверял это, но JRootPane - это JComponet, возможно, к нему можно добавить EmptyBorder, что позволит сместить JMenuBar.

В противном случае вам, вероятно, потребуется реализовать собственный JRootPane для управления макетом JMenuBar и панели содержимого.

ОБНОВЛЕНИЕ с тестированием

public class TestMenuFrame extends JFrame {

    public TestMenuFrame() throws HeadlessException {

        setTitle("Test");

        getRootPane().setBorder(new EmptyBorder(10, 10, 10, 10));

        JMenuBar mb = new JMenuBar();
        mb.add(new JMenu("Test"));

        setJMenuBar(mb);

        setSize(100, 100);

        getContentPane().setBackground(Color.RED);

        setLocationRelativeTo(null);

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        new TestMenuFrame().setVisible(true);

    }
}

Образец

person MadProgrammer    schedule 06.09.2012
comment
Я не думаю, что это моя проблема. У меня просто нет доступа к слушателям JFrame в северной части моего приложения. - person PeGiannOS; 07.09.2012
comment
А я использую недекорированную рамку. Спасибо за быстрый ответ - person PeGiannOS; 07.09.2012
comment
Во-первых, если вы можете добавлять компоненты в любую часть фрейма, вам нужно только пройти иерархию компонентов, пока вы не достигнете JRootPane, кроме того, вы заявили, что использовали setJMenu, что означает, что у вас должен быть доступ к фрейму. Во-вторых, я вряд ли думаю, что использование недекорированной рамы будет иметь какое-либо значение для решения, которое я предложил. - person MadProgrammer; 08.09.2012