java - JTextfield 默认操作后 JButton 变为启用状态
问题描述
我再次掌握了 Java 并开始使用 Swing。目前正在尝试了解 JList。
在 JList 中选择项目时,我启用了一个按钮(“删除”按钮)。当没有选择时,该按钮应该被禁用(如果没有选择,则无法删除项目,如果没有项目索引,JVM 往往会呕吐)。
通过 JTextField 默认操作(输入)添加列表项时,按钮启用,但 JList 中没有选择。启用按钮的代码甚至没有运行。这是怎么回事?也许我在某个地方想念一个听众?
所有听众都在主班,但其他听众似乎没有问题。我看不到类实例化两次,所以不是这样。任何想法都会很棒?
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class GUI extends JFrame implements Runnable, ActionListener, DocumentListener, ListDataListener, ListSelectionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
//declare and instantiate interface components
DefaultListModel<String> lm=new DefaultListModel<String>();
JList<String> jl=new JList<String>(lm);
JTextField jt=new JTextField(50);
JButton b_add=new JButton("Add");
JButton b_del=new JButton("Remove");
@Override
public void run() {
//FROM RUNNABLE INTERFACE
//set GUI (JFrame) attributes
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLocationByPlatform(true);
setName("List of Lists");
setSize(1280, 500);
setLayout(new FlowLayout());
//set component attributes
jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //single selection list
jt.getDocument().addDocumentListener(this);
//other interface components
JScrollPane sp=new JScrollPane(jl);
JButton b_exit=new JButton("Exit");
//other component attributes
sp.setSize(500, 500);
b_add.setEnabled(false);
b_del.setEnabled(false);
//set component listeners
b_add.addActionListener(this);
b_del.addActionListener(this);
b_exit.addActionListener(this);
jt.setActionCommand("TXT");
jt.addActionListener(this);
lm.addListDataListener(this);
jl.addListSelectionListener(this);
//add GUI components
add(jt);
add(sp);
add(b_add);
add(b_del);
add(b_exit);
//set GUI visible
setVisible(true);
}
//FROM ACTIONLISTENER INTERFACE
@Override
public void actionPerformed(ActionEvent ae) {
//default action on text field (enter key)
if (ae.getActionCommand()=="TXT") {
lm.addElement(jt.getText());
jt.setText(null);
} else {
//actions from buttons
switch (ae.getActionCommand()) {
//add button
case "Add":
lm.addElement(jt.getText());
jt.setText(null);
break;
//remove button
case "Remove":
if (jl.getSelectedIndex()>=0) {
lm.remove(jl.getSelectedIndex());
}
break;
//exit button
case "Exit":
setVisible(false);
dispose();
break;
//just in case
default:
break;
}
}
}
//FROM DOCUMENTEVENTLISTENER INTERFACE
@Override
public void changedUpdate(DocumentEvent de) {
b_add.setEnabled(de.getDocument().getLength()>0);
}
@Override
public void insertUpdate(DocumentEvent de) {
b_add.setEnabled(de.getDocument().getLength()>0);
}
@Override
public void removeUpdate(DocumentEvent de) {
b_add.setEnabled(de.getDocument().getLength()>0);
}
//FROM LISTDATALISTENER INTERFACE
@Override
public void contentsChanged(ListDataEvent ld) {
b_del.setEnabled(lm.getSize()>0);
}
@Override
public void intervalAdded(ListDataEvent ld) {
b_del.setEnabled(lm.getSize()>0);
}
@Override
public void intervalRemoved(ListDataEvent ld) {
b_del.setEnabled(lm.getSize()>0);
}
//FROM LISTSELECTIONLISTENER INTERFACE
@Override
public void valueChanged(ListSelectionEvent ls) {
b_del.setEnabled(jl.getSelectedIndex()>=0);
}
}
应该发生的是,“删除”按钮应该仅在 JList 中的项目被突出显示(选中)时启用。
解决方案
应该发生的是,“删除”按钮应该仅在 JList 中的项目被突出显示(选中)时启用。
那么你的代码中有太多的监听器。
不需要 DocumentListener。文本字段中的数据是否更改无关紧要。当您将文本字段中的数据添加到 JList 时,选择不会自动更改。
不需要 ListDataListener。同样,您不在乎数据是否更改。
与此要求相关的唯一侦听器是ListSelectionListener
. This listener will fire an event when the selection changes. 然后在侦听器代码中,根据列表中的选择启用/禁用按钮。
侦听器中的基本代码可能是:
int index = list.getSelectedIndex();
button.setEnabled( index = -1 ? false : true );
阅读 Swing 教程中有关如何编写 ListSelectionListener的部分以获取更多信息和一个工作示例。
推荐阅读
- c++ - 函数重载和double和long之间的混淆
- c++ - C ++ 11模板函数“隐式”转换位集
到“无符号长” - javascript - ReactJS - 如何在 URL 中获取当前页面?
- omnet++ - [osgEarth]* [Horizon] 回调中没有安装地平线信息
- php - 如何使用 ezpdf 确定页面上的剩余空间?
- python-2.7 - 从日期列中查找最大(最新)日期,然后按员工分组
- peoplesoft - Record.Insert() 人员代码未在唯一约束错误上创建异常
- http - centos 7 - 可以 ping http & https 网站,但无法在任何浏览器中浏览 http 网站
- google-app-engine - 从 Google App Engine 读取/写入 Google Drive 的费用是多少?
- c# - Cannot send email from server