特定のボタンがクリックされたときに基本的に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の作成はcontent
にopener
を追加し、中に私の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);
}
}
ああ、私はデフォルトのJPanelを作成しようとしていたので、hgapやvgapなどのデフォルト値を設定し、他のすべてのjpanelsにこれらの値があるようにしました。私はそれをどうお勧めしますか? @roberto attias –
パネルをインスタンス化する関数を定義し、それを複数回呼び出すことができます。 JPanel creator(){ JPanel p = new JPanel(); //パネルを設定する return p; } jAnimal = creator(); jMammal = creator(); ... –
これは完璧に感謝してくれました@roberto attias –