2009-02-20 3 views
3

Я пытаюсь создать графический интерфейс в java, но JMenuBar не дал мне трудного времени в течение двух дней. Может кто-нибудь, пожалуйста, скажите мне, почему он не появляется?Почему мой JMenuBar не появится?

import java.awt.*; 
import javax.swing.*; 
import javax.swing.JPanel; 
import java.awt.event.*; 
import java.awt.image.*;  
import java.io.*; 
import java.util.Arrays; 
import javax.imageio.ImageIO; 

public class selectionFrame extends JFrame 
{ 
    Font name; 
    Font title; 

    public void setup() //can't use constructer because this isn't given a size until after it is constructed. 
    { 
    //getContentPane().add(menuBar); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    getContentPane().setLayout(new FlowLayout()); 
    //getContentPane().add(j); 

    setJMenuBar(createMenuBar()); 
    //getContentPane().add(createMenuBar()); 
    } 

    public JMenuBar createMenuBar() 
    { 
    JMenuBar menuBar; 
    JMenu m_file; 
    JMenuItem mi_save; 
    JMenuItem mi_load; 

    JMenu m_edit; 
    JMenuItem mi_tileHeight; 
    JMenuItem mi_tileWidth; 

    menuBar = new JMenuBar(); 
    m_file = new JMenu("File"); 
    m_edit = new JMenu("Edit"); 

    mi_save = new JMenuItem("Save file", KeyEvent.VK_S); 
    mi_load = new JMenuItem("Load file", KeyEvent.VK_L); 
    mi_tileHeight = new JMenuItem("Set tile height", KeyEvent.VK_H); 
    mi_tileWidth = new JMenuItem("Set tile width", KeyEvent.VK_W); 

    menuBar.add(m_file); 
    m_file.add(mi_save); 
    m_file.add(mi_load); 

    menuBar.add(m_edit); 
    m_edit.add(mi_tileHeight); 
    m_edit.add(mi_tileWidth); 

    return menuBar; 
    } 

    public static void main(String[] args) //run 
    { 
    selectionFrame sel = new selectionFrame(); 
    sel.setLocationRelativeTo(null); 
    sel.setSize((int) 400 + (sel.getInsets().left + sel.getInsets().right),(int) 400 + (sel.getInsets().top + sel.getInsets().bottom)); 

    sel.setVisible(true); 
    sel.setTitle("Tiles/Meta"); 
    sel.setResizable(false); 
    sel.setFocusable(true); 
    sel.getContentPane().setSize(sel.getSize()); 
    sel.setLocation((int) sel.getX() - (sel.getWidth()/2),(int) sel.getY() - (sel.getHeight()/2)); 
    sel.setup(); 
    sel.repaint(); 

    } 
} 

ответ

5

У вас там очень много дополнительного кода.

public class SelectionFrame extends JFrame 
{ 
    Font name; 
    Font title; 

    public SelectionFrame() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setJMenuBar(createMenuBar()); 
    } 

    public JMenuBar createMenuBar() 
    { 
     JMenuBar menuBar; 
     JMenu m_file; 
     JMenuItem mi_save; 
     JMenuItem mi_load; 

     JMenu m_edit; 
     JMenuItem mi_tileHeight; 
     JMenuItem mi_tileWidth; 

     menuBar = new JMenuBar(); 
     m_file = new JMenu("File"); 
     m_edit = new JMenu("Edit"); 

     mi_save = new JMenuItem("Save file", KeyEvent.VK_S); 
     mi_load = new JMenuItem("Load file", KeyEvent.VK_L); 
     mi_tileHeight = new JMenuItem("Set tile height", 
     KeyEvent.VK_H); 
     mi_tileWidth = new JMenuItem("Set tile width", 
     KeyEvent.VK_W); 

     menuBar.add(m_file); 
     m_file.add(mi_save); 
     m_file.add(mi_load); 

     menuBar.add(m_edit); 
     m_edit.add(mi_tileHeight); 
     m_edit.add(mi_tileWidth); 

     return menuBar; 
    } 

    public void main(String args[]) 
    { 

     SelectionFrame sel = new SelectionFrame(); 
     sel.setLocationRelativeTo(null); 
     sel.setSize(400 + (sel.getInsets().left + > sel.getInsets().right), 400 
     + (sel.getInsets().top + sel.getInsets().bottom)); 

     sel.setTitle("Tiles/Meta"); 
     sel.setResizable(false); 
     sel.setFocusable(true); 

     sel.getContentPane().add(new JLabel("Content", SwingConstants.CENTER), 
     BorderLayout.CENTER); 
     sel.setLocation(sel.getX() - (sel.getWidth()/2), sel.getY() - >    (sel.getHeight()/2)); 
     sel.setVisible(true); 

    } 
} 

Это показывает, с панелью меню и все. если вы добавляете свой контент в ЦЕНТР области содержимого (по умолчанию макет границы), центр автоматически заполняет всю область содержимого, вам не нужно изменять размер.

Это отображается как окно с панелью меню, и все работает нормально.

На какой платформе вы это делаете?Я нахожусь в Vista, я получаю то, что ожидаю увидеть.

0

Когда я компилирую и запускаю его, он отображается с помощью строки меню с файлами и элементами меню редактирования. Вы ожидали большего?

Кроме того, капитализировать ваш class- SelectionFrame

EDIT: Одна вещь, которую я забыл посмотреть, код и каждый ответ здесь технически неправильно. Часто это работает, но вам не разрешено ничего делать с компонентами Swing, если вы не находитесь в AWT worker thread.

Как правило, вам не нужно много думать о рабочем потоке, потому что каждое событие, которое приходит из вашего окна, все равно будет в рабочем потоке, но есть тенденция забыть об этом, когда вы создаете свой начальный кадр - и чаще всего это просто работает.

Sun рекомендует рекомендовать вам работать с компонентами вне AWT-нити до тех пор, пока не будет реализовано окно (с пакетом() или setVisible (true)), но this is no longer considered safe.

Самый простой способ исправить это может быть для вашего основного, чтобы создать рабочий рабочий качание перед тем, как вводить ваш SelectionFrame.

Есть только 50-50 шанс, что это исправит вашу проблему, но вы все равно должны учитывать это при работе с графическим интерфейсом.

+0

Каждый раз, когда я компилирую и запускаю его, я ничего не получаю. Можете ли вы рассказать мне, что вы использовали JDK? – William

+0

1.6.0_05, но я должен ввести 10 символов –

0

sel.setVisible (true);

Должно быть последнее, что вы называете ......

1

Что Java версии вы используете? В моей системе строка меню отображается в 1.6.0_10. Попробуйте обернув тело вашего основного метода в invokeLater() вызова, так что он работает на правильном потоке, например, так:

public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       selectionFrame sel = new selectionFrame(); 
       sel.setLocationRelativeTo(null); 
       sel.setSize((int) 400 + (sel.getInsets().left + sel.getInsets().right), 
          (int) 400 + (sel.getInsets().top + sel.getInsets().bottom)); 
       sel.setTitle("Tiles/Meta"); 
       sel.setResizable(false); 
       sel.setFocusable(true); 
       sel.getContentPane().setSize(sel.getSize()); 
       sel.setLocation((int) sel.getX() - (sel.getWidth()/2), 
           (int) sel.getY() - (sel.getHeight()/2)); 
       sel.setup(); 
       sel.setVisible(true); // Follow Kendrick's advice too. 
      } 
     }); 
    } 
0

Кроме того, как раз перед вызовом sel.setVisible(true); PLS вызвать sel.pack();

Pls к сведению, что вместо setSize лучше использовать setPreferredSize, который используется во время упаковки рамы.

Не имеет отношения к вашему вопросу, но все же - использование хорошего менеджера макетов - это огромное время и разочарование спасителя при использовании Swing. MigLayout - просто отличный универсальный менеджер макетов.

1

Выключает вас ИМЕЕТ, чтобы установить JMenuBar внутри конструктора JFrame. Я понял это, глядя на различия между моим кодом и кодом с отмеченными ответами.

Благодарим вас за прекрасный ответ, Джон Гарднер. Без тебя я бы наверняка застрял месяцами.

1

В моем случае я отследил недостающую строку меню до ошибки, где я установил макет RootPane, tsk tsk. RootPane (см., Например, http://download.java.net/jdk7/archive/b123/docs/api/javax/swing/JRootPane.html) управляет компоновкой строки меню, поэтому, когда я изменил свой менеджер компоновки, он потерял планку.

Вместо этого следует использовать ContentPane макет и добавлять компоненты, например:

frame.getContentPane().setLayout(...); 
frame.getContentPane().add(...); 

На будущее ... это не имеет ничего общего с компонентом быть видимым (как сказал О.П. , рамка видна, но в строке меню нет), у меня есть рабочий код, который устанавливает JMenuBar за пределами конструктора, и, будучи безопасным для swing-thread, является хорошей практикой, это не является причиной проблемы.

Смежные вопросы