Java Combobox的ActionListener仅适用于声明后的第一列
我想通过更改第一个combobox元素的值来更改第二个combobox元素,但它不起作用。ActionListener for Combobox仅适用于声明后的第一列。如果我运行debug并按“run-Into”-它工作得很好。 这是我的密码:Java Combobox的ActionListener仅适用于声明后的第一列,java,swing,combobox,Java,Swing,Combobox,我想通过更改第一个combobox元素的值来更改第二个combobox元素,但它不起作用。ActionListener for Combobox仅适用于声明后的第一列。如果我运行debug并按“run-Into”-它工作得很好。 这是我的密码: import java.awt.Container; import java.awt.Desktop; import java.awt.Dimension; import java.awt.Font; import java.awt.event.Acti
import java.awt.Container;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class face extends JFrame {
public face() {
super("Test frame");
setDefaultCloseOperation(EXIT_ON_CLOSE);
// READ FILE //
File f=new File("");
String tname = f.getAbsolutePath()+File.separator+"1.txt";
Scanner in = null;
int i=0;
List<String> list = new ArrayList<String>();
try {
in = new Scanner(new File(tname));
} catch (FileNotFoundException e2) {
e2.printStackTrace();
}
while (in.hasNextLine())
list.add(in.nextLine());
in.close();
String[] teacherlist = list.toArray(new String[0]);
JComboBox tcombo = new JComboBox(teacherlist);
tcombo.setSelectedIndex(1);
String item = (String)tcombo.getSelectedItem();
JPanel panel = new JPanel();
panel.add(tcombo);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
File r = new File("");
//String item = (String)tcombo.getSelectedItem();
String sname = r.getAbsolutePath()+File.separator+"aaaa.txt";
List<String> slist = new ArrayList<String>();
Scanner k;
k=null;
try {
k = new Scanner(new File(sname));
} catch (FileNotFoundException e2) {
e2.printStackTrace();
}
while (k.hasNextLine())
slist.add(k.nextLine());
k.close();
String[] subjectlist = slist.toArray(new String[0]);
JComboBox scombo = new JComboBox(subjectlist);
scombo.setVisible(true);
panel.add(scombo);
}
};
tcombo.addActionListener(actionListener);
panel.add(but);
label.setVisible(false);
setContentPane(panel);
}
public static void main(String[] args)
{JFrame myWindow = new face();
myWindow.setVisible(true);
myWindow.setSize(500,500);
}}
导入java.awt.Container;
导入java.awt.Desktop;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.BoxLayout;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.SwingConstants;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Scanner;
公共类face扩展JFrame{
公众形象(){
超级(“测试框架”);
setDefaultCloseOperation(关闭时退出);
//读取文件//
文件f=新文件(“”);
字符串tname=f.getAbsolutePath()+File.separator+“1.txt”;
扫描仪输入=空;
int i=0;
列表=新的ArrayList();
试一试{
in=新扫描仪(新文件(tname));
}捕获(FileNotFoundException e2){
e2.printStackTrace();
}
while(在.hasNextLine()中)
list.add(in.nextLine());
in.close();
String[]teacherlist=list.toArray(新字符串[0]);
JComboBox tcombo=新的JComboBox(教师列表);
t目标设置选定指标(1);
字符串项=(字符串)tcombo.getSelectedItem();
JPanel面板=新的JPanel();
面板。添加(tcombo);
ActionListener ActionListener=新建ActionListener(){
已执行的公共无效操作(操作事件e){
文件r=新文件(“”);
//字符串项=(字符串)tcombo.getSelectedItem();
字符串sname=r.getAbsolutePath()+File.separator+“aaaa.txt”;
List slist=new ArrayList();
扫描仪k;
k=零;
试一试{
k=新扫描仪(新文件(sname));
}捕获(FileNotFoundException e2){
e2.printStackTrace();
}
while(k.hasNextLine())
slist.add(k.nextLine());
k、 close();
String[]subjectlist=slist.toArray(新字符串[0]);
JComboBox scombo=新的JComboBox(主题列表);
scombo.setVisible(true);
新增专家组(scombo);
}
};
tcombo.addActionListener(actionListener);
面板。添加(但是);
标签可见(假);
设置内容窗格(面板);
}
公共静态void main(字符串[]args)
{JFrame myWindow=新面();
myWindow.setVisible(true);
myWindow.setSize(500500);
}}
我想问题出在这段代码上:
JComboBox scombo = new JComboBox(subjectlist);
//scombo.setVisible(true); // not needed components are visible by default
panel.add(scombo);
组合框的默认大小为(0,0),因此没有要绘制的内容
每当您向可见GUI添加组件时,基本逻辑是:
panel.add(...);
panel.revalidate();
panel.repaint();
但是,更好的解决方案可能是在创建框架时将两个组合框都添加到GUI中。然后,当您在第一个组合框中选择一个项目时,您只需更改第二个组合框中的“数据”。您可以通过调用第二个组合框上的setModel(…)
方法来实现这一点
查看此方法的一个示例