2016-04-09 15 views
0

Also versuche ich MVC (Modell, Ansicht, Controller) zu verwenden, um meinen Code zu formatieren, und wenn ich versuche, die Ansicht der tatsächlichen Anwendung hinzuzufügen, bekomme ich einen Fehler, der besagt, dass "java.lang.IllegalArgumentException: a Fenster in einen Behälter bei java.awt.Container.checkNotAWindow bei java.awt.Container.addImpl bei java.awt.Container.add“ Während ich weiß, was der Fehler ich habe keine Ahnung, was ich tun soll (nicht Verwenden Sie MVC oder finden Sie eine Art von Work-Around) und würde jede Hilfe zu schätzen wissen. Unten werde ich den Code der beiden Klassen haben.IllegalArgumentException Fehler

Hier wird, in dem die Anwendung ausgeführt werden von:

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); 
    } 
} 

Und hier ist die Ansichtsklasse:

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) 
    { 
    } 
} 

Vielen Dank im Voraus für jede Hilfe!

Antwort

0

Container ist die Oberklasse von z.B. Panel, JPanel, Window, JFrame usw.

JFrame ist ein Fenster, so dass Sie nicht (und in der Tat kann nicht, wie Sie es hier heraus) fügen Sie es an eine andere Komponente. JFrame ist ein top-level container.

Eigentlich ist es wahrscheinlich der Fall, dass Sie nicht direkt new Container() verwenden sollten. Wenn Sie beispielsweise ein Panel wünschen, sollten Sie JPanel verwenden. Es ist ziemlich schwer für mich, genau zu sagen, was Sie beabsichtigt haben, da das Hinzufügen einer JFrame zu einer anderen Komponente ein Fehler ist. Ich sehe, wie du Dinge zu c hinzufügst, aber ich sehe nicht, dass du irgendetwas anderes damit machst.

So:

  • JFrame ist ein Fenster.
  • JFrame hat einen Inhaltsbereich, der das Fenster innerhalb des Fensters darstellt. (Der Standardinhaltsfenster ist eigentlich ein JPanel, obwohl getContentPane() kehrt es als Container.)
  • Wenn Sie Sachen in einem JFrame setzen wollen, können Sie das Zeug zum Inhaltsbereich hinzuzufügen.
  • Sie müssen keine JFrame zu etwas hinzufügen, erstellen Sie es einfach mit new und rufen Sie setVisible(true).

Das sind die Grundlagen, wie man eine JFrame richtig verwendet.

Ich empfehle auch sehr die Swing tutorials, wenn Sie sie nicht gelesen haben. Sie sind wirklich ziemlich gut.

Verwandte Themen