繁体   English   中英

用JComboBox调整JTextField

[英]adjust JTextField with JComboBox

请有人能告诉我为什么我的JComboBox没有JTextField吗? 我需要这样:

myJComboBox1      JTextField1
                  JTextField2
myJComboBox2      JTextField1
                  JTextField2

跟随这个例子

public class DisplayPanel extends JFrame {

    private JComboBox[] box;
JTextField[] field1, field2;

public DisplayPanel(){
    super(BorderLayoutTest.class.getName());
    setTitle("Simulation");
    setSize(1000,500);
    setResizable(false);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
    createComponents();
    initComponents();
}

private void createComponents(){

    box = new JComboBox[3];
    field1 = new JTextField[4];
    field2 = new JTextField[5];     
}



private void initComponents(){
     setLayout(new GridLayout(0, 2));

     for(int i = 0; i < 3; i++) {
         JPanel panel = new JPanel(new BorderLayout());
         box[i] =new JComboBox<>(new String[] { "field1", "field2"});
         panel.add(box[i], BorderLayout.NORTH);
         add(panel);
         add(createPanelWithTextFields(panel));
         box[i].setSelectedIndex(-1);
         box[i].addActionListener(new CustomActionListener(box[i]));
        }

}

private Component createPanelWithTextFields(JPanel panel) {
  //need to keep the same layout as JComboBox
    panel.setLayout(new GridLayout(0, 1));

    for(int x=0; x<4; x++){
        field1[x] = new JTextField("field1 Name " + (x+1));
        field1[x].setVisible(false);   
        panel.add(field1[x]);
    }

    for(int x=0; x<5; x++){
        field2[x] = new JTextField("field2 Name " + (x+1));
        field2[x].setVisible(false);     
        panel.add(field2[x]);
    }

    return panel;
}


class CustomActionListener implements ActionListener {
    JComboBox b;

    public CustomActionListener(JComboBox u) {
        super();
        this.b = u;
    }

    public void actionPerformed(ActionEvent e) {
        int numChosen = b.getSelectedIndex() + 1;

        switch (numChosen){
        case 1:
            for(int x=0; x<4; x++)
                field1[x].setVisible(true);
            break;
        case 2:
            for(int x=0; x<5; x++)
                field2[x].setVisible(true);
            break;
        }

    }

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override public void run() {
            new DisplayPanel().setVisible(true);
        }
    });
    }

您正在为文本字段数组分配新的文本字段,但它仅包含4个文本字段,但是您调用分配了4次以上,因此发生了最后一次rextfield引用重新分配的情况,您无法再次使用它们。您的字段数组包含对最后一个面板的文本字段的引用。这就是为什么即使您从combobox1中选择也要在最后一个面板上看到文本字段的原因。

怎么修 ?

改变这个

 field1 = new JTextField[4];

对此

field1 = new JTextField[4 * 3];

然后您不需要重新分配jtextfields。您有3个面板,每个面板有4个文本字段。

对于field2相同

这是一个例子。

public class DisplayPanel extends JFrame {

    private JComboBox[] box;
    JTextField[] field1, field2;
    Color col[] = {Color.red, Color.GREEN, Color.blue};
    int i = 0;
    int counter = 0;
    private int boxcount;
    int field1counter = 0;
    int field2counter = 0;

    public DisplayPanel() {
        //super(BorderLayoutTest.class.getName());
        setTitle("Simulation");
        setSize(1000, 500);
        //setResizable(false);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        createComponents();
        initComponents();
    }

    private void createComponents() {

        boxcount = 3;
        box = new JComboBox[1 * boxcount];
        field1 = new JTextField[4 * boxcount];
        field2 = new JTextField[5 * boxcount];
    }

    private void initComponents() {
        setLayout(new GridLayout(0, 2));

        for (int i = 0; i < 3; i++) {
            JPanel panel = new JPanel(new BorderLayout());
            box[i] = new JComboBox<>(new String[]{"field1", "field2"});
            panel.add(box[i], BorderLayout.NORTH);
            add(panel);
            add(createPanelWithTextFields(panel));
            box[i].setSelectedIndex(-1);
            box[i].addActionListener(new CustomActionListener());
        }

    }

    private Component createPanelWithTextFields(JPanel panelc) {

        JPanel panel = new JPanel(new GridLayout(0, 1));
        panel.setBackground(col[i]);
        System.out.println("......................");
        for (int x = 0; x < 4; x++) {
            System.out.println("iterating .." + (field1counter) + "  counter  " + counter);
            field1[field1counter] = new JTextField("field1 Name " + (x + 1));
            field1[field1counter].setVisible(false);
            panel.add(field1[field1counter]);
            field1counter++;
        }

        for (int x = 0; x < 5; x++) {
            field2[field2counter] = new JTextField("field2 Name " + (x + 1));
            field2[field2counter].setVisible(false);
            panel.add(field2[field2counter]);
            field2counter++;
        }
        i++;
        counter++;
        return panel;
    }

    class CustomActionListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            JComboBox b = (JComboBox) e.getSource();
            int comboidenty = 0;
            for (int k = 0; k < box.length; k++) {
                if (box[k] == b) {
                    break;
                }
                comboidenty++;
            }
            System.out.println(((JPanel) (b.getParent())).getBackground());
            int numChosen = b.getSelectedIndex() + 1;

            System.out.println("hi " + comboidenty);
            switch (numChosen) {
                case 1:
                    for (int x = 0; x < 4; x++) {
                        System.out.println("field1  " + (comboidenty * 4 + x));
                        field1[comboidenty * 4 + x].setVisible(true);
                    }
                    break;
                case 2:
                    for (int x = 0; x < 5; x++) {
                        System.out.println("field2  " + (comboidenty * 5 + x));
                        field2[comboidenty * 5 + x].setVisible(true);
                    }
                    break;
            }

        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DisplayPanel().setVisible(true);
            }
        });

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM