Появляются автоматически JTextField

Пожалуйста, как я могу автоматически отображать некоторые JTextField из того, что пользователь выбирает в JComboBox? Мой пример прост. У меня в коробке есть JComboBox с какой-то операцией. И в зависимости от того, что пользователь выбирает из этого JComboBox, у меня появляется один или несколько JTextField.

У меня есть этот код:

public static void main(String[] args) {

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            CalculatriceFenetre fenetre = new CalculatriceFenetre();
            fenetre.setVisible(true);
        }
    });
}

,

public class CalculatriceFenetre extends JFrame {

    private JTextField field1, field2;
    private JComboBox liste;

    public CalculatriceFenetre() {
        super();

        build();
    }

    private void build() {
        setTitle("Calculatrice");
        setSize(400, 200);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(buildContentPane());
    }

    private JPanel buildContentPane() {
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.setBackground(Color.white);

        field1 = new JTextField();
        field1.setColumns(10);

        field2 = new JTextField();
        field2.setColumns(10);
        field2.setVisible(false);

        panel.add(field1);
        panel.add(field2);

        liste = new JComboBox(new OperateursModel());
        liste.addActionListener(new CustomActionListener());
        panel.add(liste);

        return panel;
    }

    class CustomActionListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            if (liste.getSelectedItem().equals("op1")) {
                 field2.setVisible(true);
            }
        }
    }

,

public class OperateursModel extends DefaultComboBoxModel {
private ArrayList<String> operateurs;

public OperateursModel(){
    super();
    operateurs = new ArrayList<String>();
    operateurs.add("op1");

}

public String getSelectedOperateur(){
    return (String)getSelectedItem();
}

@Override
public Object getElementAt(int index) {
    return operateurs.get(index);
}

@Override
public int getSize() {
    return operateurs.size();
}

@Override
public int getIndexOf(Object element) {
    return operateurs.indexOf(element);
    }
}

2 ответа

Решение

Как я уже говорил, это простой подход к вашему вопросу. Сначала создайте все необходимые JTextFields и переключайте его видимость, а не удаляйте и добавляйте его во время выполнения.

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class DynamicTextFieldsApp
{
    public static void main(String[] args){
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JFrame f = new JFrame("JTextField Toggler");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
            f.add(new DisplayPanel());
            f.pack();
            f.setLocationRelativeTo(null);
        }});
    }
}

Простой JPanel с comboBox и несколькими JTextFields.

class DisplayPanel extends JPanel
{
    public static final int PLAYERS = 5;
    private JComboBox cmbPlayerNumber;
    private JTextField[] txtPlayerName;
    private JLabel lblPlayerNumber;

    public DisplayPanel(){
        setPreferredSize(new Dimension(170, 240));
        createComponents();
        initComponents();
        loadComponents();
        setBoundsForComponents();       
    }

    private void createComponents(){
        cmbPlayerNumber = new JComboBox(new String[]{"1", "2", "3", "4", "5"});
        txtPlayerName = new JTextField[PLAYERS];
        lblPlayerNumber = new JLabel("Num of Players");     
    }

    private void initComponents(){
        for(int x=0; x<PLAYERS; x++){
            txtPlayerName[x] = new JTextField("No Name " + (x+1));
            txtPlayerName[x].setVisible(false);     
        }
        cmbPlayerNumber.setSelectedIndex(-1);
        cmbPlayerNumber.addActionListener(new CmbListener());       
    }

    private void loadComponents(){
        add(cmbPlayerNumber);
        add(lblPlayerNumber);
        for(int x=0; x<PLAYERS; x++)
            add(txtPlayerName[x]);          
    }

    private void setBoundsForComponents(){
        setLayout(null);
        lblPlayerNumber.setBounds(10, 0, 150, 30);          
        cmbPlayerNumber.setBounds(10, 30, 150, 30);
        for(int x=0; x<PLAYERS; x++)
            txtPlayerName[x].setBounds(10, (30*x)+70, 150, 30);
    }

    private class CmbListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            int numOfPlayers = cmbPlayerNumber.getSelectedIndex() + 1;
            for(int x=0; x<numOfPlayers; x++)
                txtPlayerName[x].setVisible(true);
            for(int x=numOfPlayers; x<PLAYERS; x++){
                txtPlayerName[x].setVisible(false);             
                txtPlayerName[x].setText("No name " + (x+1));                   
            }               
        }
    }                   
}

И, конечно, вы можете работать с каким-то менеджером макетов вместо нулевого макета.

И в зависимости от того, что пользователь выбирает из этого JComboBox, у меня появляется один или несколько JTextField.

Тогда вы можете написать ActionListener обрабатывать выбор элемента из поля со списком.

Вы можете начать с чтения раздела из учебного пособия по Swing " Как использовать поле со списком" для рабочего примера, в котором используется ActionListener,

В вашем случае вы хотите добавить текстовое поле во фрейм, чтобы код был что-то вроде:

JTextField textField = new JTextField(10);
frame.add( textField );
frame.revalidate();
frame.repaint();

Кроме того, вам не нужно создавать собственные ComboBoxModel, Вы можете просто добавить элементы к модели по умолчанию. Опять же, учебник покажет вам, как это сделать.

Другие вопросы по тегам