带有 ActionListener 的多个 JComboBoxes

Multiple JComboBoxes with ActionListener

此代码取自我的原始代码并出于测试目的进行了修改。

问题:为什么点击一个JComboBox后,无法点击其他JComboBox?

目的:点击 JComboBox 后,选择被复制到 JTextField。

我已经阅读了 Whosebug 上的许多其他帖子并进行了相应的更改,但他们并没有解决问题。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class Test implements ActionListener {

JComboBox[] cb;
JTextField[] text = new JTextField[3];
JFrame frame2;

public static void main(String[] args) {
    Test t = new Test();
    t.changeEntry();
}

private void changeEntry() {

    frame2 = new JFrame();
    frame2.setLayout(new BorderLayout());

    Panel p = new Panel();
    p.setLayout(new GridLayout(3, 3));
    initialize(p);
    JTextField url = new JTextField();
    JTextField username = new JTextField();
    JPasswordField password = new JPasswordField();
    addTextField(p, 0, url);
    addTextField(p, 1, username);
    addPassField(p, 2, password);

    frame2.add(p, "Center");

    frame2.setTitle("Entries");
    frame2.setVisible(true);
    frame2.setSize(500, 500);
    frame2.setLocation(430, 100);
    frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

private void initialize(Panel p) {

    String[] array1 = {"A"};
    String[] array2 = {"B"};
    String[] array3 = {"C"};

    JComboBox aa = new JComboBox<String>(array1);
    JComboBox bb = new JComboBox<String>(array2);
    JComboBox cc = new JComboBox<String>(array3);
    cb = new JComboBox[3];
    cb[0] = aa;
    cb[0].addActionListener(this);
    cb[0].setActionCommand("A");
    cb[1] = bb;
    cb[1].addActionListener(this);
    cb[1].setActionCommand("B");
    cb[2] = cc;
    cb[2].addActionListener(this);
    cb[2].setActionCommand("C");
    p.add(cb[0]);
    p.add(cb[1]);
    p.add(cb[2]);
}

@Override
public void actionPerformed(ActionEvent e) {
    String s = e.getActionCommand();
    if (s.equals("A")) {
        checkSelection(cb[0], 0);
    } else if (s.equals("B")) {
        checkSelection(cb[1], 1);
    } else if (s.equals("C")) {
        checkSelection(cb[2], 2);
    }
}

private void checkSelection(JComboBox cb, int i) {
    String str = (String) cb.getSelectedItem();
    text[i].setText(str);
}

private void addTextField(Container c, int i, JTextField tf) {
    tf.setText("Edit entry here");
    tf.setEditable(true);
    c.add(tf);
    text[i] = tf;
}

private void addPassField(Container c, int i, JPasswordField pf) {
    pf.setText("test");
    pf.setEditable(true);
    c.add(pf);
    text[i] = pf;
}
}

我和我的教授查看了代码,发现 JComboBoxes 不喜欢与 JTextFields 重叠。这是使错误消失的代码修改:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class Test implements ActionListener {

JComboBox[] cb;
JTextField[] text = new JTextField[3];
JFrame frame2;

public static void main(String[] args) {
    Test t = new Test();
    t.changeEntry();
}

private void changeEntry() {

    frame2 = new JFrame();
    frame2.setLayout(new BorderLayout());

    Panel p = new Panel();
    p.setLayout(new GridLayout(2, 3));
    JTextField url = new JTextField();
    JTextField username = new JTextField();
    JPasswordField password = new JPasswordField();
    addTextField(p, 0, url);
    addTextField(p, 1, username);
    addPassField(p, 2, password);
    initialize(p);

    frame2.add(p, "Center");

    frame2.setTitle("Entries");
    frame2.setVisible(true);
    frame2.setSize(500, 500);
    frame2.setLocation(430, 100);
    frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

private void initialize(Panel p) {

    String[] array1 = {"A"};
    String[] array2 = {"B"};
    String[] array3 = {"C"};

    JComboBox aa = new JComboBox<String>(array1);
    JComboBox bb = new JComboBox<String>(array2);
    JComboBox cc = new JComboBox<String>(array3);
    cb = new JComboBox[3];
    cb[0] = aa;
    cb[0].addActionListener(this);
    cb[0].setActionCommand("A");
    cb[1] = bb;
    cb[1].addActionListener(this);
    cb[1].setActionCommand("B");
    cb[2] = cc;
    cb[2].addActionListener(this);
    cb[2].setActionCommand("C");
    p.add(cb[0]);
    p.add(cb[1]);
    p.add(cb[2]);
}

@Override
public void actionPerformed(ActionEvent e) {
    String s = e.getActionCommand();
    if (s.equals("A")) {
        checkSelection(cb[0], 0);
    } else if (s.equals("B")) {
        checkSelection(cb[1], 1);
    } else if (s.equals("C")) {
        checkSelection(cb[2], 2);
    }
}

private void checkSelection(JComboBox cb, int i) {
    String str = (String) cb.getSelectedItem();
    text[i].setText(str);
}

private void addTextField(Container c, int i, JTextField tf) {
    tf.setText("Edit entry here");
    tf.setEditable(true);
    c.add(tf);
    text[i] = tf;
}

private void addPassField(Container c, int i, JPasswordField pf) {
    pf.setText("test");
    pf.setEditable(true);
    c.add(pf);
    text[i] = pf;
}
}

因此,对于遇到此问题的任何人,请查看我的问题与修改之间的差异:

p.setLayout(new GridLayout(3, 3));
initialize(p);
JTextField url = new JTextField();
JTextField username = new JTextField();
JPasswordField password = new JPasswordField();
addTextField(p, 0, url);
addTextField(p, 1, username);
addPassField(p, 2, password);

p.setLayout(new GridLayout(2, 3));
JTextField url = new JTextField();
JTextField username = new JTextField();
JPasswordField password = new JPasswordField();
addTextField(p, 0, url);
addTextField(p, 1, username);
addPassField(p, 2, password);
initialize(p);