Java 隐藏/显示JTextField

Java 隐藏/显示JTextField,java,swing,jtextfield,Java,Swing,Jtextfield,我有一个JTextField,它在开始时必须隐藏,在特定情况下必须显示。这是我的代码: package StudentNotes; import java.awt.BorderLayout; public class EditCourse extends JDialog { private JTextField textField; /** * Create the dialog. */ public EditCourse(JDialog mai

我有一个JTextField,它在开始时必须隐藏,在特定情况下必须显示。
这是我的代码:

package StudentNotes;

import java.awt.BorderLayout;

public class EditCourse extends JDialog {
    private JTextField textField;

    /**
     * Create the dialog.
     */
    public EditCourse(JDialog mainFrame, final StudApp studAppObj) {
        super(mainFrame, ModalityType.APPLICATION_MODAL);
        setPreferredSize(new Dimension(330, 200));
        setTitle("Edit course");
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setAlwaysOnTop(true);

        ArrayList<Corso> listCourses = studAppObj.getCorsi();
        listCourses.toArray();

        String[] listData = { "one", "two", "three", "four",
                              "five", "six", "seven" };
        final JList list = new JList(listData);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {

                if (e.getValueIsAdjusting() == true) {
                    textField.setVisible(true); // it does not show (why?)

                }
            }
        });
        JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setSize(new Dimension(118, 40));

        textField = new JTextField();
        textField.setVisible(false); // it is invisible (OK)
        textField.setColumns(10);
        GroupLayout groupLayout = new GroupLayout(getContentPane());
        groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addGap(108)
                    .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                        .addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 108, GroupLayout.PREFERRED_SIZE))
                    .addContainerGap(108, Short.MAX_VALUE))
        );
        groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addGap(21)
                    .addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 64, GroupLayout.PREFERRED_SIZE)
                    .addGap(18)
                    .addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(49, Short.MAX_VALUE))
        );
        getContentPane().setLayout(groupLayout);
        pack();
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
    }
}
打包学生笔记;
导入java.awt.BorderLayout;
公共类EditCourse扩展JDialog{
私有JTextField textField;
/**
*创建对话框。
*/
公共编辑课程(JDialog大型机,最终StudApp studappbj){
super(大型机,ModalityType.APPLICATION_MODAL);
setPreferredSize(新尺寸(330200));
课程名称(“编辑课程”);
setDefaultCloseOperation(JDialog.DISPOSE\u ON\u CLOSE);
setAlwaysOnTop(真);
ArrayList listCourses=studAppObj.getCorsi();
listCourses.toArray();
String[]listData={“一”、“二”、“三”、“四”,
“五”、“六”、“七”};
最终JList列表=新JList(listData);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.getSelectionModel().addListSelectionListener(新建ListSelectionListener()){
@凌驾
public void值已更改(ListSelectionEvent e){
如果(如getValueIsAdjusting()==true){
textField.setVisible(true);//它不显示(为什么?)
}
}
});
JScrollPane scrollPane=新的JScrollPane(列表);
滚动窗格。设置大小(新尺寸(118,40));
textField=新的JTextField();
textField.setVisible(false);//它不可见(OK)
textField.setColumns(10);
GroupLayout=newgrouplayout(getContentPane());
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addGap(108)
.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
.addComponent(文本字段、GroupLayout.PREFERRED\u大小、GroupLayout.DEFAULT\u大小、GroupLayout.PREFERRED\u大小)
.addComponent(滚动窗格,GroupLayout.PREFERRED_SIZE,108,GroupLayout.PREFERRED_SIZE))
.addContainerGap(108,简称最大值))
);
groupLayout.setVerticalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addGap(21)
.addComponent(滚动窗格,GroupLayout.PREFERRED\u大小,64,GroupLayout.PREFERRED\u大小)
.addGap(18)
.addComponent(文本字段、GroupLayout.PREFERRED\u大小、GroupLayout.DEFAULT\u大小、GroupLayout.PREFERRED\u大小)
.addContainerGap(49,简称最大值))
);
getContentPane().setLayout(groupLayout);
包装();
setLocationRelativeTo(空);
可设置大小(假);
setVisible(真);
}
}
想法是:

当用户在JList上单击要编辑的值时,JTextField必须出现

您是否尝试过在将文本字段设置为可见后使用
textField.revalidate()
,然后再使用
textField.repaint()
textField.setVisible(true)后使用
如果您试图显示/隐藏可见容器的组件,则需要调用包含您的
JTextField
的容器的
revalidate()
repaint()
方法

因此,只需在代码中添加下一行代码,即可完成所有工作:

 EditCourse.this.revalidate();
 EditCourse.this.repaint();

在此处添加actionListener可能会有所帮助。您希望它在单击时显示,还是只想启用它?如果要启用它,请在开头使用
setEnabled(flase)
,然后单击
setEnabled(true)
。否则,您需要重新绘制。@ambigram\u maker我需要它必须显示为不启用。。那么,在这种情况下,请检查下面的答案。啊,当然,忘了它需要在容器上调用,而不是组件本身!