2016-04-09 2 views
0

Поэтому я пытаюсь использовать MVC (модель, представление, контроллер) для форматирования моего кода и при попытке добавить представление к реальному приложению. Я получаю сообщение об ошибке «java.lang.IllegalArgumentException: добавление окно в контейнер на java.awt.Container.checkNotAWindow на java.awt.Container.addImpl на java.awt.Container.add " Хотя я знаю, в чем ошибка, я понятия не имею, что мне делать (не использовать MVC или найти какую-то работу), и будет признательна за любую помощь. Ниже я буду иметь код двух классов.Ошибка IllegalArgumentException

Вот где приложение запускается из:

import javax.swing.*; 
import java.awt.*; 
/** 
* Write a description of class FencingApplication here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class Application 
{ 
    public static void main(String[] args){ 
     InputView view = new InputView(); 
     InputModel model = new InputModel(); 
     InputController ctrl = new InputController(view, model); 

     JFrame window = new JFrame(""); 
     window.setSize(500, 600); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Container c = new Container(); 
     c.setLayout(new BorderLayout()); 
     c.add(view, BorderLayout.CENTER); 
     JButton btList = new JButton("List"); 
     JButton btPools = new JButton("Pools"); 
     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(1, 2)); 
     buttonPanel.add(btList); 
     buttonPanel.add(btPools); 
     c.add(buttonPanel, BorderLayout.NORTH); 
     btList.addActionListener(ctrl);//where is the action performed method defined 
     btPools.addActionListener(ctrl); 
     window.setVisible(true); 
    } 
} 

А вот класс вид:

import javax.swing.*; //Jframe/JButton/JLabel/etc 
import java.awt.*; //container 
import java.util.*; 
/** 
* Write a description of class InputView here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
public class InputView extends JFrame implements Observer 
{ 
    JLabel lbPaste = new JLabel("Please paste the seeding here."); 
    JTextArea taPaste = new JTextArea(); 
    JButton btPools = new JButton("Pools"); 

    JLabel lbNum = new JLabel("Please input the number of pools you want to have."); 
    JTextField tfNum = new JTextField(); 
    public InputView() 
    { 
     JPanel numPanel = new JPanel(); 
     numPanel.setLayout(new BorderLayout()); 
     numPanel.add(lbNum, BorderLayout.NORTH); 
     numPanel.add(tfNum, BorderLayout.CENTER); 

     JPanel pastePanel = new JPanel(); 
     pastePanel.setLayout(new BorderLayout()); 
     pastePanel.add(lbPaste, BorderLayout.NORTH); 
     pastePanel.add(new JScrollPane(taPaste), BorderLayout.CENTER); 



     Container c = getContentPane(); 
     c.setLayout(new GridLayout(2, 1)); 
     c.add(numPanel); 
     c.add(pastePanel); 

     setTitle("Pools"); 
     setSize(350, 500);//width then height 
     setVisible(true); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    public void update(Observable obs, Object obj) 
    { 
    } 
} 

Заранее спасибо за любую помощь!

ответ

0

Container является суперклассом, например. Panel, JPanel, Window, JFrame и т.д.

JFrame это окно, так что вы не должны (и на самом деле не может, так как вы узнали здесь) добавить его к другому компоненту. JFrame - top-level container.

На самом деле, вероятно, вы не должны использовать new Container() напрямую. Например, если вы хотите панель, вы должны использовать JPanel. Мне тяжело точно сказать, что вы намеревались, так как добавление JFrame к другому компоненту - ошибка. Я вижу, что вы добавляете материал в c, но я не вижу, чтобы вы делали с ним что-нибудь еще.

Итак:

  • JFrame это окно.
  • JFrame имеет панель содержимого, которая представляет собой панель внутри окна. (Область содержимого по умолчанию на самом деле является JPanel, хотя getContentPane() возвращает ее как Container.)
  • Если вы хотите разместить материал в JFrame, вы добавляете материал в область содержимого.
  • Вам не нужно добавлять JFrame ко всему, просто создайте его с помощью new и позвоните по номеру setVisible(true).

Это как правильно использовать JFrame.

Я также очень рекомендую Swing tutorials, если вы не прочитали их. Они действительно очень хороши.

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