2013-09-23 4 views
3

Я создаю приложение с двумя панелями в рамке вместе с панелью меню вверху. Строка меню отображается очень хорошо, и все действия, установленные до сих пор, работают, но две другие панели никогда не появляются.Добавление панелей в рамку, но не показ при запуске приложения.

Я попытался восстановить все панели и линии, которые добавляют их к кадру и не могут найти никаких ошибок.

Первая из двух панелей, которые не отображаются, формируется в методе drawForm(), показывается, прежде чем я добавил некоторые компоненты, но так как не показывался, даже когда я удаляю компоненты снова.

Вот класс Рама:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class Frame { 
    public static void drawFrame(){ 
     // Create frame 
     JFrame frame = new JFrame("Frame"); 
     // Set default close operation 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // Set frame attributes 
     frame.setVisible(true); 
     frame.setSize(400, 300); 
     frame.setResizable(false); 
     // Set Layout 
     frame.setLayout(new BorderLayout()); 
     // Add Components 
     frame.add(drawMenuBar(), BorderLayout.NORTH); 
     JPanel twinPane = new JPanel(); 
      frame.add(twinPane, BorderLayout.CENTER); 
      twinPane.setLayout(new GridLayout(1, 2)); 
      twinPane.add(drawForm()); 
      twinPane.add(drawInfo()); 
    } // Ends method drawFrame 

    public static JMenuBar drawMenuBar(){ 
     //Create menu structure 
     JMenuBar menu = new JMenuBar(); 
      JMenu file = new JMenu("File"); 
       JMenuItem clear = new JMenuItem("Clear"); 
       JMenuItem calculate = new JMenuItem("calculate"); 
       JMenuItem exit = new JMenuItem("Exit"); 
      JMenu help = new JMenu("Help"); 
       JMenuItem about = new JMenuItem("About"); 
       JMenuItem instructions = new JMenuItem("Instructions"); 
     //Add menu items to repective area of menu tree 
     menu.add(file); 
      file.add(clear); 
      file.add(calculate); 
      file.add(exit); 
     menu.add(help); 
      help.add(about); 
      help.add(instructions); 
     //Add ActionListener 
     exit.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       MainApp app = new MainApp(); 
       app.exit(); 
      } 

     }); 
     //Set Return 
     return menu; 
    } // Ends method drawMenuBar 

    public static JPanel drawForm(){ 
     //Set panel with layout and border 
     JPanel form = new JPanel(); 
     form.setBorder(BorderFactory.createTitledBorder("Form")); 
     form.setLayout(new BoxLayout(form, BoxLayout.PAGE_AXIS)); 
     //Create field and labels for form panel and add to form panel 
     JLabel label1 = new JLabel("text1"); 
      form.add(label1); 
     JTextField textfield1 = new JTextField(5); 
      form.add(textfield1); 
     JLabel label2 = new JLabel("text2"); 
      form.add(label2); 
     JTextField textfield2 = new JTextField(5); 
      form.add(textfield2); 
     JButton calc = new JButton("calculate"); 
      form.add(calc); 
     JTextField result = new JTextField(5); 
      form.add(result); 
     //Set return 
     return form; 
    } // Ends method drawForm 

    public static JPanel drawInfo(){ 
     //Set Panel with layout and border 
     JPanel info = new JPanel(); 
     info.setBorder(BorderFactory.createTitledBorder("Information")); 
     //Set Return 
     return info; 
    } // Ends method drawInfo 

} // Ends class Frame 

Основной метод в другом классе, но класс кадров создает графический интерфейс пользователя. Рамка вместе с панелью меню работает отлично, но все после этого ничего не делает.

Я признателен за любую помощь, спасибо

Джоша

+1

Независимо от наших ответов, ваш вопрос задан * много раз раньше, в том числе: [Почему я не должен называть setVisible (true) перед добавлением компонентов?] (Http://stackoverflow.com/questions/10790457/ почему-я не должен-вызову-setvisibletrue-перед тем, добавляя-компоненты). Голосование закрывается как дубликат, поскольку вопрос вряд ли поможет будущим посетителям. –

+1

@HovercraftFullOfEels Second ... – MadProgrammer

ответ

3

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

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

public static void drawFrame(){ 
    // Create frame 
    JFrame frame = new JFrame("Frame"); 
    // Set default close operation 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    // Set frame attributes 

    // !! Don't do this here... 
    //frame.setVisible(true); 
    // ... IMHO, better to use pack... 
    //frame.setSize(400, 300); 
    frame.setResizable(false); 
    // Set Layout 
    frame.setLayout(new BorderLayout()); 
    // Add Components 
    frame.add(drawMenuBar(), BorderLayout.NORTH); 
    JPanel twinPane = new JPanel(); 
    frame.add(twinPane, BorderLayout.CENTER); 
    twinPane.setLayout(new GridLayout(1, 2)); 
    twinPane.add(drawForm()); 
    twinPane.add(drawInfo()); 

    // !! Do it here instead... 
    frame.pack(); 
    frame.setVisible(true); 
} // Ends method drawFrame 
2

Вы установку JFrame видимой перед тем вы добавили компоненты. Не делай этого. Добавьте компоненты, pack() ваш JFrame, и только затем установите его видимым.

Но независимо от того, какие ответы вы могли бы получить, ваш вопрос был задан много раз раньше, в том числе: Why shouldn't I call setVisible(true) before adding components?. Голосование закрывается как дубликат, поскольку вопрос вряд ли поможет будущим посетителям.

0

Согласен с @MadProgrammer. Вы должны поместить коды - frame.pack(); frame.setVisible(true) - внизу.

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