【问题标题】:Appear automatically JTextField自动出现 JTextField
【发布时间】:2015-08-19 18:43:17
【问题描述】:

请问,如何从用户在 JComboBox 中选择的内容中自动显示一些 JTextField ? 我的例子很简单。我的盒子里有一个 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);
    }
}

【问题讨论】:

  • 你为什么不创建你需要的所有 JtextField 并在组合框选择时,将 JTextField 的可见性设置为 true/false?除非您需要满足任意数量的 JTextField,否则这种方式会更容易。
  • 这就是我所做的。我设置了 JTextField 的可见性,但它不起作用
  • 您是否在代码中添加了调试语句来验证 ActionEvent 是否发生?您的模型中只有一个元素(为什么仍在使用自定义模型???),我不确定您是否可以重新选择相同的项目。
  • @Mehdi 在下面看看我的解决方案。

标签: java swing jframe jtextfield


【解决方案1】:

根据用户从这个 JComboBox 中选择的内容,我会出现一个或多个 JTextField。

然后你可以写一个ActionListener来处理从组合框中选择一个项目。

您可以先阅读 How to Use a Combo Box 上的 Swing 教程中的部分,了解使用 ActionListener 的工作示例。

在您的情况下,您想在框架中添加一个文本字段,因此代码将类似于:

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

此外,您无需创建自定义ComboBoxModel。您可以将项目添加到默认模型。同样,本教程将向您展示如何执行此操作。

【讨论】:

  • 我编辑了我的问题。我使用 ActionListener 来显示filed2。在 ActionListener 之前,我设置了 filed2 的可见性 (false),在 ActionListener 之后,我将可见性设置为 (true)。
【解决方案2】:

就像我提到的,这是解决您问题的一种简单方法。首先创建您需要的所有 JTextField 并切换其可见性,而不是在运行时删除和添加它。

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);
        }});
    }
}

一个带有组合框和几个 JTextField 的简单 JPanel。

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));                   
            }               
        }
    }                   
}

当然,您可以使用一些布局管理器而不是空布局。

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 2018-01-08
    • 2012-01-31
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多