【问题标题】:Variable sized array of JTextFields and other widgetsJTextFields 和其他小部件的可变大小数组
【发布时间】:2014-09-14 00:14:23
【问题描述】:
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 会显示为好像for 循环没有运行。

任何帮助将不胜感激。

【问题讨论】:

  • 那么...您到底想做什么?
  • 请将frame.setVisible(true) 作为main 的最后一行。首先将组件添加到容器中,然后调用pack(),然后调用setVisible(),这样它就能够以更好的方式实现它的大小。你有没有做过绘画。您不会首先向人们展示您的空白纸,而是首先在该纸上绘画,然后绘画然后将其展示。此外,请阅读有关Concurrency in Swing 的信息。此外,您是否尝试将JTextField 的列数从3 增加到更大的值!!!!

标签: java arrays swing user-interface


【解决方案1】:

这是因为你调用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());
    }
}

当!就是这样!!

【讨论】:

    【解决方案2】:

    在您的goBListeneractionPerformed 方法中,您应该在添加statusP 面板后调用panel.revalidate() 以强制重新绘制面板,这将触发重绘。

    您还应该尝试遵循 Java 命名约定,goBListener 应该以大写字母开头,GoBListener,这样会让其他人更容易阅读(但也会让你更容易阅读其他人的代码)

    你可以考虑使用List的一些代替数组,这是个人的事情,但List通常更灵活。更多详情请关注Collections

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2018-07-29
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多