可变大小的JTextFields和其他小部件数组

时间:2014-07-23 00:12:44

标签: java arrays swing user-interface

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)时,createStatusP()没有出现,我不确定它是否因为它没有运行,或者因为它无法正常工作。

我已经尝试将GUI constructor方法放在JButton中,但只有{{1}}会出现,好像for循环没有运行。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

goBListener的{​​{1}}方法中,您应该在添加{{1}后调用actionPerformed强制重新插入面板,这将触发重新绘制面板。

您还应该尝试遵循Java命名约定,panel.revalidate()应该以大写字母statusP开头,这将使其他人更容易阅读(但也会让您更容易阅读其他人的代码)

您可以考虑使用goBListener中的一些来代替数组,这是个人的事情,但GoBListener通常更灵活。请查看Collections了解更多详情

答案 1 :(得分: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());
    }
}
D !!那就是!!