2016-12-06 45 views
0

我正在寫一個gui程序,當單擊某些按鈕時基本上會刪除並添加jpanel。我試圖創建jpanels的層次: 這裏的層次在actionlistener事件上交換jpanels

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

最初的JPanel是被添加到JFrame上啓動了開門紅。 Opener將有哺乳動物和爬行動物。 這些按鈕中的每一個點擊後將調用swap(currentJPanel),然後調用removeall(),repaint()revalidate(),然後使用x按鈕添加下一個JPanel,每個按鈕調用swap(currentJPanel)方法。這將一直持續到你到達JPanel的終止點時,點擊按鈕後會執行x動作,然後調用reset(),詢問用戶是否想繼續遊戲或獲得結果。如果選擇繼續遊戲,則removeall(),repaint(),revalidate()並再次添加opener

我創建了一個名爲的JPanel content將每個我JPanels中,加入openercontent,並添加content到JFrame。在某個按鈕被點擊之前,不應該將未打開的按鈕添加到JFrame中。以下是我目前的代碼。當我運行gui時,我創建的所有按鈕都可見。啓動時只應顯示爬行動物和哺乳動物按鈕。另外,當點擊其中一個按鈕時,不會刪除或添加任何按鈕。唯一能夠正確工作的按鈕是getResult按鈕,它是唯一不調用swap()的按鈕。我最初的想法是,我不能將jButton傳遞給方法,但是當我調用swap()時沒有出現錯誤,所以我不確定。任何幫助和/或建議將不勝感激。

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; 

這裏的效果不是創建多個JPanels(),而是讓所有變量引用同一個JPanel實例。因此,當您使用不同的變量添加按鈕時,實際上是將它們添加到同一個面板。

+0

好吧,這是有道理的,我試圖創建一個默認的JPanel,以便我可以爲像hgap和vgap這樣的東西設置默認值,並讓我所有其他jpanel都具有這些值。你會如何建議我這樣做? @roberto ATTIAS –

+0

可以定義一個函數實例化面板,然後調用它多次:) JPanel的創建者({ JPanel的p值=新JPanel(); //配置面板 return p; } jAnimal = creator(); jMammal = creator(); ... –

+0

非常感謝@roberto attias –