2016-12-06 5 views
0

Я пишу программу gui, которая в основном удаляет и добавляет jpanels при нажатии определенных кнопок. Я пытаюсь создать иерархию JPanel,: Вот иерархииОбмен jpanels на событие actionlistener

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(), а затем добавляет следующую JPanel под ними с помощью кнопок x, каждый из которых вызывает метод swap(currentJPanel). Это будет продолжаться до тех пор, пока вы не достигнете завершающего JPanel кнопками, которые при нажатии на него будут выполняться действие x, а затем вызовет reset(), который спрашивает, хочет ли пользователь продолжить игру или получить результат. Если продолжена игра, то removeall(), repaint(), revalidate() и добавьте opener еще раз.

Я создал JPanel называется content поместить каждый из моих JPanel, в, добавил 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); 
 
    } 
 

 
}

ответ

0

На беглый взгляд, я подозреваю, что ваша проблема может быть здесь:

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

Эффект здесь не создавать несколько JPanels(), а чтобы все переменные относятся к тому же экземпляру JPanel. Поэтому, когда вы добавляете кнопки с использованием разных переменных, вы фактически добавляете их в одну панель.

+0

А как я понимаю, я пытался создать стандартную JPanel, чтобы установить значения по умолчанию для таких вещей, как hgap и vgap, и все мои другие jpanels имеют эти значения. Как бы вы предложили мне это сделать? @roberto attias –

+0

вы можете определить функцию, создающую экземпляр панели, а затем вызвать ее несколько раз: JPanel creator() { JPanel p = new JPanel(); // настройка панели return p; } jAnimal = creator(); jMammal = creator(); ... –

+0

Это прекрасно поработало благодаря @roberto attias –

 Смежные вопросы

  • Нет связанных вопросов^_^