Java Combobox的ActionListener仅适用于声明后的第一列

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

我想通过更改第一个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.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(…)
方法来实现这一点

查看此方法的一个示例