2016-12-06 11 views
0

特定のボタンがクリックされたときに基本的にjpanelsを削除して追加するGUIプログラムを作成しています。私は、のJPanelの階層を作成しようとしています: ここでは初期のJPanelがスタートアップでのJFrameに追加された開幕戦である階層アクションリスナーイベントでjpanelsを交換する

Opener Mammal Tiger Tiger_caged //terminating button Tiger_riding //terminating button Reptile Frog Frog_eating //terminating button Frog_null //terminating button

です。 Openerは、哺乳動物および爬虫類を有する。 これらのボタンをクリックすると、swap(currentJPanel)が呼び出され、removeall(),repaint()、およびrevalidate()が呼び出され、次のJPanelの下にxボタンが追加され、それぞれswap(currentJPanel)メソッドが呼び出されます。これは、終了したJPanelに到達するまで続けられ、ボタンをクリックするとxアクションが実行され、reset()が呼び出され、ゲームを続行するか結果を得るかを尋ねるメッセージが表示されます。継続ゲームが選択されている場合は、removeall()repaint()revalidate()、およびopenerを再度追加します。

私はJPanelの作成はcontentopenerを追加し、中に私のJPanelのそれぞれを配置するcontentと呼ばれ、JFrameのにcontentを追加しました。オープナーにないボタンは、特定のボタンがクリックされるまでJFrameに追加しないでください。以下は私の現在のコードです。 GUIを実行すると、作成したボタンがすべて表示されます。スタートアップ時には、爬虫類と哺乳類のボタンだけが表示されるはずです。また、ボタンの1つをクリックすると、何も削除または追加されません。正しく動作する唯一のボタンは、getResultボタンです。これは、swap()を呼び出さない唯一のボタンです。私の最初の考えは、メソッドにjButtonを渡すことはできませんが、スワップ()を呼び出すとエラーが出ないので、わかりません。どんな助けや提案も大歓迎です。ザッと見で

import java.awt.*; 
 
import java.awt.event.*; 
 
import javax.swing.*; 
 
import javax.swing.event.*; 
 

 
public class DreamInterpreter extends JFrame implements ActionListener{ 
 
    private final LayoutManager layoutMain; 
 

 
    private String result = ""; 
 
    private JLabel question = new JLabel("What was in your dream?"); 
 
    private String reset = "What was in your dream?"; 
 
    private JTextArea showResult; 
 

 
//BUTTONS 
 
    private JButton exit = new JButton("Exit"); 
 
    private JButton getResult= new JButton("INTERPRET MY DREAM"); 
 
    private JButton continueGame = new JButton("Add more to my dream"); 
 

 
    private JButton animal = new JButton("Animal"); 
 
     private JButton mammal = new JButton("Mammal"); 
 
     private JButton tiger= new JButton("Tiger"); 
 
     private JButton tiger_caged= new JButton("The tiger is in a cage"); 
 
     private JButton tiger_riding= new JButton("The tiger is being ridden"); 
 
     private JButton reptile = new JButton("Reptile"); 
 
     private JButton frog= new JButton("Frog"); 
 
     private JButton frog_eating= new JButton("Eating"); 
 
     private JButton frog_null= new JButton("None of these"); 
 
    private JButton person = new JButton("Person"); 
 
    private JButton location = new JButton("Location"); 
 

 

 
//PANELS 
 

 
    //DEFAULT PANEL 
 
    JPanel standard; 
 
    JPanel content; 
 

 
    JPanel opener; 
 
    JPanel jContinueGame; 
 
    
 
    JPanel jAnimal, jPerson, jLocation; 
 
     JPanel jMammal, jReptile; 
 
     JPanel jTiger; 
 
     JPanel jFrog; 
 
    
 

 
    public DreamInterpreter(){ 
 

 
     super("Dream Interpreter"); 
 
     layoutMain = new BorderLayout(); // add components with add(component, BorderLayout.CENTER (NORTH, SOUTH, EAST, WEST) 
 
     setLayout(layoutMain); 
 

 
     exit.addActionListener(this); 
 
     getResult.addActionListener(this); 
 
     continueGame.addActionListener(this); 
 

 
     animal.addActionListener(this); 
 
     person.addActionListener(this); 
 
     location.addActionListener(this); 
 

 
     mammal.addActionListener(this); 
 
     reptile.addActionListener(this); 
 

 
     frog.addActionListener(this); 
 
     frog_eating.addActionListener(this); 
 
     frog_null.addActionListener(this); 
 

 
     tiger.addActionListener(this); 
 
     tiger_caged.addActionListener(this); 
 
     tiger_riding.addActionListener(this); 
 

 
//FORMATTING LAYOUT 
 
     showResult = new JTextArea(15,20); 
 
//DEFAULT 
 
     standard = new JPanel(); 
 
     standard.setLayout(new FlowLayout(FlowLayout.CENTER,10,8)); 
 
//HEADER 
 
     JPanel header = new JPanel(); 
 
     header.add(question); 
 
//OPENER 
 
     opener = standard; 
 
     opener.add(animal); 
 
     opener.add(location); 
 
     opener.add(person); 
 
//CONTENT 
 
     content = new JPanel(); 
 
     content.add(opener); 
 
//CONTINUE GAME 
 

 
     jContinueGame = standard; 
 
     jContinueGame.add(continueGame); 
 
     jContinueGame.add(getResult); 
 

 
//DECLARE OTHER JPANELS 
 
     
 
     jAnimal = jPerson = jLocation = standard; 
 
     jMammal = jReptile = standard; 
 
     jFrog = jTiger = standard; 
 
     
 
     add(header, BorderLayout.NORTH); 
 
     add(content, BorderLayout.CENTER); 
 
     
 
//ADDING 
 

 
    //jAnimal 
 
     jAnimal.add(mammal); 
 
     jAnimal.add(reptile); 
 
      jMammal.add(tiger); 
 
       jTiger.add(tiger_caged); 
 
       jTiger.add(tiger_riding); 
 
      jReptile.add(frog); 
 
       jFrog.add(frog_eating); 
 
       jFrog.add(frog_null); 
 
    //jPerson 
 
    //jLocation 
 

 
    } 
 

 
    public void actionPerformed(ActionEvent event){ 
 

 
     if(event.getSource() == animal){ 
 
     swap(jAnimal); 
 
     question.setText("What kind of animal was in your dream?"); 
 
     } 
 
     if(event.getSource() == mammal){ 
 
      swap(jMammal); 
 
      question.setText("What kind of mammal was in your dream?"); 
 
     } 
 
      if(event.getSource() == tiger){ 
 
       swap(jTiger); 
 
       question.setText("What was the tiger doing?"); 
 
      } 
 
       if(event.getSource() == tiger_caged){ 
 
        result += ""; 
 
        reset(); 
 
       } 
 
       if(event.getSource() == tiger_riding){ 
 
        result+=""; 
 
        reset(); 
 
       } 
 
     if(event.getSource() == reptile){ 
 
      swap(jReptile); 
 
      question.setText("What kind of reptile was in your dream?"); 
 
     } 
 
      if(event.getSource()==frog){ 
 
       swap(jFrog); 
 
      } 
 
       if(event.getSource()==frog_eating){ 
 
        result+=""; 
 
        reset(); 
 
       } 
 
       if(event.getSource()==frog_null){ 
 
        result+=""; 
 
        reset(); 
 
       } 
 

 
     if(event.getSource() == continueGame){ 
 
      swap(opener); 
 
      question.setText("What was in your dream?"); 
 
     } 
 
     if(event.getSource() == getResult){ 
 
      content.removeAll(); 
 
      content.revalidate(); 
 
      content.repaint(); 
 
      content.add(showResult); 
 
      showResult.setText(""+result); 
 
     } 
 

 
    } 
 
    public static void main(String[] args){ 
 
     DreamInterpreter dreamInterpreter = new DreamInterpreter(); 
 
     dreamInterpreter.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 
     dreamInterpreter.setSize(450, 350); 
 
     dreamInterpreter.setVisible(true); 
 
    } 
 

 
    public void reset(){ 
 
     content.removeAll(); 
 
     content.revalidate(); 
 
     content.repaint(); 
 
     question.setText("What would you like to do?"); 
 
     content.add(jContinueGame); 
 
    } 
 
    
 
    public void swap(JPanel panel){ 
 
     content.removeAll(); 
 
     content.revalidate(); 
 
     content.repaint(); 
 
     content.add(panel); 
 
    } 
 

 
}

答えて

0

、私はあなたの問題はここにあるかもしれない疑いがある:

//DECLARE OTHER JPANELS 
    jAnimal = jPerson = jLocation = standard; 
    jMammal = jReptile = standard; 
    jFrog = jTiger = standard; 

ここでは効果は)(複数のJPanelを作成することではなく、すべて持っています変数は同じJPanelインスタンスを参照します。したがって、異なる変数を使用してボタンを追加すると、実際には同じパネルに追加されます。

+0

ああ、私はデフォルトのJPanelを作成しようとしていたので、hgapやvgapなどのデフォルト値を設定し、他のすべてのjpanelsにこれらの値があるようにしました。私はそれをどうお勧めしますか? @roberto attias –

+0

パネルをインスタンス化する関数を定義し、それを複数回呼び出すことができます。 JPanel creator(){ JPanel p = new JPanel(); //パネルを設定する return p; } jAnimal = creator(); jMammal = creator(); ... –

+0

これは完璧に感謝してくれました@roberto attias –