2014-12-06 75 views
0

好了,所以当我按下一个JButton menuselect1,我想它来创建4个新objecs,attack1 2 3和4,然后将它们添加到JPanel的fightmenu。 这是到目前为止我的代码,它是一个迷你的口袋妖怪游戏。的Java Swing的JButton必须创建4个新对象,并添加到JPanel的

首先创建我的所有对象,然后我设定的尺寸,并将它们添加到不同的JPanels

public class MainFrame extends JFrame { 

    JPanel mainwindow = new JPanel(); 
    JPanel bottom = new JPanel(); 
    JPanel combat = new JPanel(); 
    JPanel selectionmenu = new JPanel(); 
    JPanel fightmenu = new JPanel(); 
    JButton menuselect1 = new JButton("Fight"); 
    JButton menuselect2 = new JButton("Minimons"); 
    JButton menuselect3 = new JButton("Bag"); 
    JButton menuselect4 = new JButton("Run"); 
    JButton attack1 = new JButton("Tackle"); 
    JButton attack2 = new JButton("Lightningbolt"); 
    JButton attack3 = new JButton("Thunder-Shock"); 
    JButton attack4 = new JButton("Hyper-Beam"); 

    JButton poke1 = new JButton("Ekans"); 
    JButton poke2 = new JButton("Pikachu"); 
    public static void main(String[] args){ 
     new MainFrame(); 
    } 
    public MainFrame(){ 
     super("MiniMon"); 
     setSize(640,640); 
     setResizable(false); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     add(mainwindow); 

     // SIZES 
     combat.setPreferredSize(new Dimension(640,452)); 
     bottom.setPreferredSize(new Dimension(640,160)); 
     selectionmenu.setPreferredSize(new Dimension(320,160)); 
     fightmenu.setPreferredSize(new Dimension(320,160)); 

     mainwindow.setLayout(new BorderLayout()); 
     mainwindow.add(combat, BorderLayout.NORTH); 
     mainwindow.add(bottom, BorderLayout.SOUTH); 

     combat.setLayout(new BorderLayout()); 
     combat.add(poke1, BorderLayout.NORTH); 
     combat.add(poke2, BorderLayout.SOUTH); 

     bottom.setLayout(new BorderLayout()); 
     bottom.add(selectionmenu, BorderLayout.EAST); 
     bottom.add(fightmenu, BorderLayout.WEST); 

     selectionmenu.setLayout(new GridLayout(2,2)); 
     selectionmenu.add(menuselect1); 
     selectionmenu.add(menuselect2); 
     selectionmenu.add(menuselect3); 
     selectionmenu.add(menuselect4); 

     fightmenu.setLayout(new GridLayout(2,2)); 

     setVisible(true); 
    } 
} 

设置我fightmenu使用2x2的网格布局,所以我只需要添加4对象,只要按下JButton menuselect1。我不太清楚如何去做这件事。我知道我应该添加一个eventlistener,但是当我尝试时,它什么都没做。 我试过这样做:

fightmenu.setLayout(new GridLayout(2,2)); 
     menuselect1.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
       fightmenupress(); 
       } 
      private void fightmenupress() { 
       fightmenu.add(attack1); 
       fightmenu.add(attack2); 
       fightmenu.add(attack3); 
       fightmenu.add(attack4); 
      } 
      }); 

但它只是没有做什么。

+0

如果你想在按'menuselect1'的时候发生什么事情,你不应该添加监听器,而不是JPanel? – csmckelvey 2014-12-06 16:15:40

+0

另见:http://stackoverflow.com/questions/4279435/java-how-would-i-dynamically-add-swing-component-to-gui-on-click – matthiasboesinger 2014-12-06 16:20:41

回答

2

当您添加(或删除)组件可见GUI,基本代码是:

panel.add(...); 
panel.revalidate(); // to invoke the layout manager 
panel.repaint(); // to repaint all the components on the panel 
+0

所以我必须更新面板?编辑:它的作品!谢谢 – 2014-12-06 16:19:45

+0

@MathiasBøgebjerg:请阅读[如何接受一个答案(http://stackoverflow.com/help/someone-answers)。 – 2014-12-06 16:25:49

0

我加入重新验证并重新绘制,和它的工作!

private void fightmenupress() { 
       fightmenu.add(attack1); 
       fightmenu.add(attack2); 
       fightmenu.add(attack3); 
       fightmenu.add(attack4); 
       fightmenu.revalidate(); 
       fightmenu.repaint(); 
      } 
      });