2013-03-16 2 views
1

В принципе у меня есть класс, который действует как контейнер. Это JFrame, у которого есть конструктор, который принимает JPanel. Теперь я создал несколько JPanels вне класса контейнера. Я разработал их по определенным причинам, главным образом, с шаблоном проектирования MVC.Как добавить JPanel в контейнер из другого класса?

Проблема заключается в том, что всякий раз, когда я добавляю в контейнер контейнер JPanel, из класса контейнера он отображается пустым. Ошибка компиляции отсутствует. Я не понимаю, почему это не добавит того, о чем я прошу. Я отправлю некоторый код, это контейнер:

public class MainFrame { 

    private JFrame mainContainer = new JFrame("Frog Checkers"); 

    private JPanel frame = new testFrame(); 

    public void start() { 
     mainContainer(frame); 
    } 

    private JFrame mainContainer(JPanel frame) { 
     mainContainer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainContainer.setSize(925, 608); 
     mainContainer.setVisible(true); 
     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
     mainContainer.setLocation(dim.width/2 - mainContainer.getSize().width 
      /2, dim.height/2 - mainContainer.getSize().height/2); 
     mainContainer.setResizable(false); 

     mainContainer.add(frame); 

     return mainContainer; 
    } 
} 

И это пример одного JPanel я пытаюсь добавить:

public class testFrame extends JPanel { 
    private JPanel testPanel = new JPanel() 
    private JButton testButton, anotherButton; 

    public testFrame() { 
     testPanel.setLayout(new GridBagLayout()); 
     GridBagConstraints constraints = new GridBagConstraints(); 

     testButton = new JButton("New Button"); 
     constraints.gridx = 0; // Location on grid 
     constraints.gridy = 3; // Location on grid 
     constraints.gridwidth = 2; // How many grids the width will consume 
     constraints.gridheight = 1; // How many grids the length will consume 
     constraints.weightx = 1.0; // for resizing 
     constraints.weighty = 1.0; // for resizing 
     constraints.anchor = GridBagConstraints.SOUTHWEST; // Where it will be anchored 
     constraints.ipadx = 20; // Internal padding 
     constraints.ipady = 20; // Inernal padding 
     constraints.insets = new Insets(50,50,50,50); 
     testPanel.add(testButton, constraints); 

     anotherButton = new JButton("another Button"); 
     constraints.gridx = 0; // Location on grid 
     constraints.gridy = 3; // Location on grid 
     constraints.gridwidth = 2; // How many grids the width will consume 
     constraints.gridheight = 1; // How many grids the length will consume 
     constraints.weightx = 1.0; // for resizing 
     constraints.weighty = 1.0; // for resizing 
     constraints.anchor = GridBagConstraints.SOUTHWEST; // Where it will be anchored 
     constraints.ipadx = 20; // Internal padding 
     constraints.ipady = 20; // Inernal padding 
     constraints.insets = new Insets(50, 50, 120, 80); 
     testPanel.add(anotherButton, constraints); 
    } 
} 

Я использую GridBagLayout, потому что было сказано много, чтобы не использовать нулевой макет. Но если кто-нибудь знает способ обойтись с использованием нулевого макета, пожалуйста, поделитесь. И чтобы быть немного яснее, весь этот код работал бы, если бы у меня было все это как метод внутри класса контейнера, но я не хочу этого. Любые идеи очень приветствуются.

+0

См. [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/a/9554657/418556) –

ответ

1

Проблема с вашим классом testFrame. Он расширяетJPanel и внутри его вы взяли еще JPanel, который не нужен. Если вы настаиваете на принятии, вы должны добавить его в testFrame, используя инструкцию add(testPanel); в конце конструктора testFrame.

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

public class testFrame extends JPanel { 
    private JButton testButton, anotherButton; 

    public testFrame() { 
     setLayout(new GridBagLayout()); 
     GridBagConstraints constraints = new GridBagConstraints(); 

     testButton = new JButton("New Button"); 
     constraints.gridx = 0; // Location on grid 
     constraints.gridy = 3; // Location on grid 
     constraints.gridwidth = 2; // How many grids the width will consume 
     constraints.gridheight = 1; // How many grids the length will consume 
     constraints.weightx = 1.0; // for resizing 
     constraints.weighty = 1.0; // for resizing 
     constraints.anchor = GridBagConstraints.SOUTHWEST; // Where it will be anchored 
     constraints.ipadx = 20; // Internal padding 
     constraints.ipady = 20; // Inernal padding 
     constraints.insets = new Insets(50,50,50,50); 
     add(testButton, constraints); 

     anotherButton = new JButton("another Button"); 
     constraints.gridx = 0; // Location on grid 
     constraints.gridy = 3; // Location on grid 
     constraints.gridwidth = 2; // How many grids the width will consume 
     constraints.gridheight = 1; // How many grids the length will consume 
     constraints.weightx = 1.0; // for resizing 
     constraints.weighty = 1.0; // for resizing 
     constraints.anchor = GridBagConstraints.SOUTHWEST; // Where it will be anchored 
     constraints.ipadx = 20; // Internal padding 
     constraints.ipady = 20; // Inernal padding 
     constraints.insets = new Insets(50, 50, 120, 80); 
     add(anotherButton, constraints); 
    } 
} 

И в MainFrame, используйте

getContentPane().add([testFrame object]);

+0

Я пробовал это, ничего не делает. –

+0

После этого вы должны вызвать метод 'pack();'. –

+0

Это тоже не помогает. Я попробовал все это. Он просто не появится. –

0

Согласен с Равиндрой, что непосредственно с помощью JFrame.getContentPane() является передовой практикой. Другая вещь, которую вы, вероятно, должны сделать, это дать этому ContentPane явный макет (аналогичный тому, что вы сделали с вашим JPanel). Что-то вроде:

mainContainer.getContentPane().setLayout(new BorderLayout()); 
mainContainer.getContentPane().add(yourPanel, BorderLayout.CENTER); 

Вы можете выбрать любой макет, который вы хотите, но я часто выбираю BorderLayout для моих главных кадров, потому что область CENTER является «жадной» (все, что вы положили будет автоматически пытаться заполнить пространство), и это часто желаемое поведение.

Другие вещи, которые могут помочь включить использование свойства fill в GridBagConstraints, чтобы уведомить его о попытке заполнить всю область вашей панели и переопределитьпанели Panel, чтобы дать вашему макету подсказку размера.

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