2014-07-23 33 views
1
public class Creator extends JFrame { 

    JLabel[] pos; 
    JTextField[] monInitFi; 
    JPanel panel, statusP, inputP; 
    JTextField numMonsFi; 
    JButton goB, initRollB; 
    int numMons; 

    public Creator() { 
     panel = new JPanel(); 

     createInputP(); 
     panel.add(inputP); 

     add(panel); 
    } 

    //The Input board 
    public JPanel createInputP() { 
     inputP = new JPanel(); 

     numMonsFi = new JTextField(3); 
     inputP.add(numMonsFi); 

     goB = new JButton("Go"); 
     goB.addActionListener(new goBListener()); 
     inputP.add(goB); 

     return inputP; 
    } 

    //Creates the initiative input board. 
    public JPanel createStatusP() { 
     statusP = new JPanel(); 
     monInitFi = new JTextField[numMons]; 

     for (int i = 0; i < numMons; i++) { 
      monInitFi[i] = new JTextField(3); 
      statusP.add(monInitFi[i]); 
     } 

     initRollB = new JButton("Roll"); 
     statusP.add(initRollB); 

     return statusP; 
    } 

    //The button listener, should update numMons, and create and add the initiative panel. 
    public class goBListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      numMons = Integer.parseInt(numMonsFi.getText()); 
      createStatusP(); 
      panel.add(statusP); 
     } 
    } 

    public static void main(String[] args) { 

     Creator c = new Creator(); 

     c.setVisible(true); 
     c.setSize(1000, 600); 
     c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     c.setTitle("D&D 4e Encounter Tracker"); 
    } 
} 

所以这只是我想要做的一个示例,但我甚至无法获得基本工作。当我运行这个statusP(JPanel)没有显示出来,我不确定是因为它没有运行,或者因为它不起作用。JTextFields和其他小部件的可变大小的阵列

我试过把createStatusP()方法放在GUI constructor中,但只有JButton会出现,就好像for循环没有运行一样。

任何帮助将不胜感激。

+0

那么...你想要做什么? – MarsAtomic

+0

请将'frame.setVisible(true)'作为'main'的最后一行。首先将组件添加到容器中,然后调用'pack()'然后调用'setVisible()',这样它就能够以更好的方式实现它的大小。你有没有进行绘图。你不要先向人们展示你的空白表格,先画一张表格,然后画出来然后展示出来。此外,请阅读[Swing中的并发](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。此外,你是否试图将'JTextField'的列数从'3'增加到一些更大的值! –

回答

0

在你goBListeneractionPerformed方法,你应该打电话panel.revalidate()强制进行重新铺设出将触发重绘,你已经添加了statusP面板后面板。

你也应该尝试并遵循Java的命名约定,该goBListener应以大写,GoBListener启动,这将使它更容易给别人看的(但也会让你更容易阅读其他人的代码)

而不是阵列,你可能会考虑使用一些List,这是个人的事情,但List通常更灵活。请参阅Collections以了解更多详细信息

0

这是因为您致电createInputP(),因为它是一个过程,但它不是!这是一个函数,它会返回一些在这种情况下是inputP面板的东西!所以实际发生的事情是构造函数中的可重写方法调用!所以解决方法是在createInputP()方法之前添加final关键字!

// final keyword after public keyword! 
public final JPanel createInputP(){ ..... } 

并修改goBListener象下面这样:

public class goBListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     numMons = Integer.parseInt(numMonsFi.getText()); 
     panel.revalidate(); 
     panel.add(createStatusP()); 
    } 
} 

党!而已 !!