我正在寫一個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中,加入opener
到content
,並添加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);
}
}
好吧,這是有道理的,我試圖創建一個默認的JPanel,以便我可以爲像hgap和vgap這樣的東西設置默認值,並讓我所有其他jpanel都具有這些值。你會如何建議我這樣做? @roberto ATTIAS –
可以定義一個函數實例化面板,然後調用它多次:) JPanel的創建者({ JPanel的p值=新JPanel(); //配置面板 return p; } jAnimal = creator(); jMammal = creator(); ... –
非常感謝@roberto attias –