2016-04-09 9 views
0

MVC(モデル、ビュー、コントローラ)を使用してコードをフォーマットしようとしていますが、実際のアプリケーションにビューを追加しようとすると「java.lang.IllegalArgumentException:コンテナへのウィンドウ java.awt.Container.checkNotAWindow at java.awt.Container.addImpl at java.awt.Container.add " エラーが何であるか分かりますが、私は何をすべきか分かりませんMVCを使用するか、何らかの回避策を見つける)、どんな助けにも感謝しています。以下で私は2つのクラスのコードを持っていきます。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は、例えば、 (あなたがここに見られるように、実際にはできない)PanelJPanelWindowJFrameなど

JFrameは窓であるので、あなたはいけない別のコンポーネントに追加します。 JFrametop-level containerです。

実際には、new Container()を直接使用しないでください。たとえば、パネルが必要な場合はJPanelを使用します。他のコンポーネントにJFrameを追加するとエラーが発生するため、意図した内容を正確に伝えるのは難しいことです。私はcに物を追加するのを見ますが、私はあなたがそれを使って他の何かをしているのを見ません。だから、

  • JFrameがウィンドウです。
  • JFrameには内容ペインがあり、これはウィンドウ内のパネルです。 getContentPane()Containerとして返しても、デフォルトのコンテンツペインは実際にはJPanelです。
  • JFrameにコンテンツを追加する場合は、コンテンツペインに追加します。
  • JFrameを追加する必要はありません。newで作成し、setVisible(true)と呼んでください。

これらは正しくJFrameの使用方法の基本です。

読んでいない場合は、Swing tutorialsも強くお勧めします。彼らは本当にかなり良いです。

関連する問題