JFrame:通过按钮删除 JTextFields?
JFrame: Removing JTextFields through a button?
我的 GUI 有一个按钮,允许我将新的 JTextField 放入数组列表,然后将其放在我的 GUI 上。我还想创建另一个按钮,用于删除数组列表中的最后一个 JTextField。我的 "Remove" 按钮的 ActionListener 具有以下代码
private class Remover implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
remove(listOfTextFields.get(listOfTextFields.size()));
pack();
invalidate();
repaint();
}
}
我原以为它只会删除最后一个创建的 JTextField 实例,但我得到了一个 IndexOutofBoundsException,其索引为#out of bounds for length#。 # 不管我添加了多少 JTextField。我以为我在界限内,它会删除我的数组列表中的最后一个 JTextField,但我想我的逻辑不正确。
我试着写下 remove(listOfTextFields.get(listOfTextFields.size()-1));
,这样我就可以删除一个框,但我无法继续单击 "Remove" 按钮来执行更多操作。我错过了什么?
完整代码供您参考:
public class TheGUI extends JFrame {
List<JTextField> listOfTextFields = new ArrayList<JTextField>();
List<String> wordsToChoose = new ArrayList<String>();
private JTextField instruct;
private JButton submit;
private JButton addNew;
private TheGUI frame;
private Random r = new Random();
private JButton remove;
public TheGUI() { //My GUI with the default fields & buttons that should be on there.
super("Chili");
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
instruct = new JTextField("Choose your words");
instruct.setEditable(false);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 0;
c.gridy = 0;
add(instruct, c);
addNew = new JButton("Add");
c.weightx = 0.0;
c.gridx = 1;
c.gridy = 0;
add(addNew, c);
remove = new JButton("Remove");
c.weightx = 0.0;
c.gridx= 2;
c.gridy = 0;
add(remove, c);
submit = new JButton("Submit!");
c.weightx = 0.5;
c.gridwidth = 3;
c.gridx = 0;
c.gridy = GridBagConstraints.PAGE_END;
add(submit, c);
addNew.addActionListener(new Adder());
submit.addActionListener(new Randomizer());
remove.addActionListener(new Remover());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
setVisible(true);
}
private class Adder implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
JTextField textfield = new JTextField();
listOfTextFields.add(textfield);
GridBagConstraints textFieldConstraints = new GridBagConstraints();
textFieldConstraints.fill = GridBagConstraints.HORIZONTAL;
textFieldConstraints.weightx = 0.5;
textFieldConstraints.gridx = 0;
textFieldConstraints.gridwidth = 4;
textFieldConstraints.gridy = listOfTextFields.size();
add(textfield, textFieldConstraints);
pack();
revalidate();
repaint();
}
}
private class Remover implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
remove(listOfTextFields.get(listOfTextFields.size()));
pack();
invalidate();
repaint();
}
}
您忘记从 Remover 的列表中删除 JTextField。通过这样做,他想在您每次再次单击时删除相同的元素,但它已经不在 GUI 中,只在列表中。
IndexOutOfBoundsException 是因为列表的索引从 0 开始。例如,如果列表包含一个值,则 .size()
returns 1。因此使用 .size() - 1
已经正确了。
您可以找到有关索引的更多信息here。
试试这个实现,它应该可以工作。
private class Remover implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
remove(listOfTextFields.get(listOfTextFields.size()-1));
listOfTextFields.remove(listOfTextFields.size()-1)
pack();
invalidate();
repaint();
}
}
我的 GUI 有一个按钮,允许我将新的 JTextField 放入数组列表,然后将其放在我的 GUI 上。我还想创建另一个按钮,用于删除数组列表中的最后一个 JTextField。我的 "Remove" 按钮的 ActionListener 具有以下代码
private class Remover implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
remove(listOfTextFields.get(listOfTextFields.size()));
pack();
invalidate();
repaint();
}
}
我原以为它只会删除最后一个创建的 JTextField 实例,但我得到了一个 IndexOutofBoundsException,其索引为#out of bounds for length#。 # 不管我添加了多少 JTextField。我以为我在界限内,它会删除我的数组列表中的最后一个 JTextField,但我想我的逻辑不正确。
我试着写下 remove(listOfTextFields.get(listOfTextFields.size()-1));
,这样我就可以删除一个框,但我无法继续单击 "Remove" 按钮来执行更多操作。我错过了什么?
完整代码供您参考:
public class TheGUI extends JFrame {
List<JTextField> listOfTextFields = new ArrayList<JTextField>();
List<String> wordsToChoose = new ArrayList<String>();
private JTextField instruct;
private JButton submit;
private JButton addNew;
private TheGUI frame;
private Random r = new Random();
private JButton remove;
public TheGUI() { //My GUI with the default fields & buttons that should be on there.
super("Chili");
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
instruct = new JTextField("Choose your words");
instruct.setEditable(false);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 0;
c.gridy = 0;
add(instruct, c);
addNew = new JButton("Add");
c.weightx = 0.0;
c.gridx = 1;
c.gridy = 0;
add(addNew, c);
remove = new JButton("Remove");
c.weightx = 0.0;
c.gridx= 2;
c.gridy = 0;
add(remove, c);
submit = new JButton("Submit!");
c.weightx = 0.5;
c.gridwidth = 3;
c.gridx = 0;
c.gridy = GridBagConstraints.PAGE_END;
add(submit, c);
addNew.addActionListener(new Adder());
submit.addActionListener(new Randomizer());
remove.addActionListener(new Remover());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
setVisible(true);
}
private class Adder implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
JTextField textfield = new JTextField();
listOfTextFields.add(textfield);
GridBagConstraints textFieldConstraints = new GridBagConstraints();
textFieldConstraints.fill = GridBagConstraints.HORIZONTAL;
textFieldConstraints.weightx = 0.5;
textFieldConstraints.gridx = 0;
textFieldConstraints.gridwidth = 4;
textFieldConstraints.gridy = listOfTextFields.size();
add(textfield, textFieldConstraints);
pack();
revalidate();
repaint();
}
}
private class Remover implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
remove(listOfTextFields.get(listOfTextFields.size()));
pack();
invalidate();
repaint();
}
}
您忘记从 Remover 的列表中删除 JTextField。通过这样做,他想在您每次再次单击时删除相同的元素,但它已经不在 GUI 中,只在列表中。
IndexOutOfBoundsException 是因为列表的索引从 0 开始。例如,如果列表包含一个值,则 .size()
returns 1。因此使用 .size() - 1
已经正确了。
您可以找到有关索引的更多信息here。
试试这个实现,它应该可以工作。
private class Remover implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
remove(listOfTextFields.get(listOfTextFields.size()-1));
listOfTextFields.remove(listOfTextFields.size()-1)
pack();
invalidate();
repaint();
}
}