2013-09-21 5 views
1

Я изучаю java, и я пытаюсь добавить панель меню в свой кадр из другого класса (практикуя разделение кода на несколько классов для лучшей организации программы).Добавление компонентов Swing из другого класса

Вот пример моего кода:

public class MainApp { 

public static void main(String[] args) { 
    // Create window 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setSize(600, 400); 

    // Create main panel 
    JPanel content = new JPanel(); 
    content.setLayout(new BorderLayout()); 
    frame.add(content); 

    //Create menu bar 
    menubar menu = new menubar(); 
    content.add(menu.menuBar(), BorderLayout.NORTH); 
      //Other stuff... 

} // Ends main method 
} // Ends MainApp class 

А класс MenuBar:

public class menubar { 
public static void menuBar(){ 
    JMenuBar menu = new JMenuBar(); 
    JMenu file = new JMenu("File"); 
     JMenuItem clear = new JMenuItem("New"); 
     JMenuItem exit = new JMenuItem("Exit"); 
    JMenu help = new JMenu("Help"); 
     JMenuItem about = new JMenuItem("About"); 
     JMenuItem instructions = new JMenuItem("Instructions"); 
} // Ends method menuBar 
} // Ends class menubar 

Я использую затмение, а в строке:

content.add(menu.menuBar(), BorderLayout.NORTH); 

«добавить »подчеркнуто, и в результате я не могу скомпилировать код.

Я искал способ решить эту проблему, и, насколько я могу судить, это должно сработать.

Любая помощь приветствуется.

Спасибо

Джош

ответ

2

Обратите внимание, что ваш Menubar() метода является недействительным типа не было возвращен, следовательно, никакого значения, в то время как добавить() метод содержания (JPanel), который вы использовали требует два параметра, которые являются (JComponent типа [Обратите внимание, что JMenuBar является подклассом JComponent], внутр [для целей Оформление печатных])

content.add(menu.menuBar(), BorderLayout.NORTH); 

Ну быстро исправить код ниже:

public class menubar { 
public static JMenuBar menuBar(){ 
    JMenuBar menu = new JMenuBar(); 
    JMenu file = new JMenu("File"); 
     JMenuItem clear = new JMenuItem("New"); 
     JMenuItem exit = new JMenuItem("Exit"); 
    JMenu help = new JMenu("Help"); 
     JMenuItem about = new JMenuItem("About"); 
     JMenuItem instructions = new JMenuItem("Instructions"); 
    return menu; 
} // Ends method menuBar 
} // Ends class menubar 

Мой совет для вас использовать концепцию наследования (расширяющее класс Menubar к JMenuBar так, что ваш класс может действовать как JMenuBar) при работе с графическим интерфейсом в Java, а не в зависимости от концепции композиции. Вы можете следить также выше пост в отношении установки JMenuBar:

frame.setJMenuBar(menu.menuBar()); 

Если вы новичок в Java программирования, вы должны начать практиковать Java стандарты кодирования, особенно правильное именование класса и методов. Первая буква имени класса должна быть заглавной, а ваши имена метода должны содержать по крайней мере глагол. :)

1

Метод menuBar имеет тип void возвращение так не применяется для метода add. так что вам нужно будет

content.add(menubar.menuBar(), BorderLayout.NORTH); 

при возвращении menu из метода menuBar

Помимо: setJMenuBar используется для установки JMenuBar для JFrame.

frame.setJMenuBar(menu.menuBar()); 
1

Вместо:

content.add(menu.menuBar(), BorderLayout.NORTH); 

Я думаю, что вы имеете в виду это:

content.add(menubar.menuBar(), BorderLayout.NORTH); 

... но это еще не будет работать, потому что тип возвращаемого значения этого метода является void. Это должно быть JMenuBar.

0

Я думаю, что вы:

  • не хочет создавать new menubar() если menubar.menubar() является static функцией
  • хочет public static JMenuBar menubar() { ... }, не пустое
  • хотят menubar.menubar() к return menu иначе, этот метод был просто дорогой no-op

content.add(menu.menuBar(), ...) подчеркнуто потому, что yo u не может использовать метод void в качестве аргумента другому методу.

Кроме того, вы должны всегда ссылаться на статическое поле или метод, используя класс, а не экземпляр. И имена классов должны начинаться с заглавной буквы (Menu).

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