【问题标题】:JComboBox actionListener doesn't functionJComboBox actionListener 不起作用
【发布时间】:2018-04-07 01:51:06
【问题描述】:

我有一个有 4 个私有属性的类,通过一个 JComboBox 选择,我想通过调用一个过程来修改它们。但是,似乎即使 JComboBox 与选择一起出现,显示的属性也不会改变。

public class PanneauVehicule extends JPanel {


private String[] vehicules;
private int majCarburant;
private int majPassager;


public class PanneauVehicule extends JPanel {
//Main constructor
   public PanneauVehicule(){
       //Creates a JPanel
       super();
       //Sets layout as BorderLayout
       setLayout(new BorderLayout());
       initListeVehicule();
       initLabels();
    }
 public void initListeVehicule(){

    vehicules = new String[] {Constantes.CS100 , Constantes.CS300 , 
            Constantes.GREYHOUND102D3 , Constantes.GREYHOUNDG4500 , 
            Constantes.TGVATLANTIQUE , Constantes.TGVDUPLEX};

    final JComboBox<String> vehiculesList = new JComboBox<>(vehicules);
    //Keep in mind the comboBox does appear with the right selections
    add(vehiculesList,BorderLayout.NORTH);
    //Here's where it doesnt work.
    vehiculesList.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e){
            majInfo(2,4);
        }
    });
}
public void majInfo(int test1, int test2){
    this.majCarburant = test2;
    this.majPassager = test1;
}

public void initLabels(){

    JPanel panneauBas = new JPanel();
    panneauBas.setLayout(new GridLayout(2,1,5,5));

    JLabel labelCarburant = new JLabel();
    labelCarburant.setText("Type de caburant: " + this.majCarburant);

    JLabel labelPassagers = new JLabel();
    labelPassagers.setText("Nb de passagers: " + this.majPassager);

    panneauBas.add(labelPassagers);
    panneauBas.add(labelCarburant);

    add(panneauBas, BorderLayout.SOUTH);
    panneauBas.setBackground(Color.WHITE);
}

之后,我使用另一个程序使 majCarburant 和 majPassager 出现在屏幕上。但是,它们的值显示为默认值 (0)。我可以在不使用 ActionListener 的情况下手动更改它们的值,但手头的任务需要我使用一个。

【问题讨论】:

  • 您的代码所做的只是更新 majCarburant 和 majPassager 变量的值。变量不显示在屏幕上。您需要使用新值更新 Swing 组件。由于您似乎在 GUI 上使用 JLabels,因此您需要使用 setText(...) 方法来更改标签的显示。如果您需要更多帮助,并且将来当您提出问题时,请发布适当的 minimal reproducible example 来说明问题。
  • 我提到我使用了一个函数,它通过 JLabels 和 setText 在屏幕上显示值。我认为没有必要添加它,但它基本上是 initLabels();一开始就叫。由于字数限制,我放不下。
  • initLables() 在您创建 GUI 时使用。当您要更改标签中显示的值时,它与此无关。 您需要在标签上调用 setText() 方法来更改其值!!!。更改变量的值没有任何作用。
  • I can't fit it in because of character limit - 那是因为您还没有发布MCVE。您的问题是关于在生成 ActionEvent 时更改标签的值。因此,创建一个带有标签的 JFrame 和一个带有 ActionListener 的 JButton。单击按钮时,更改文本。先让它发挥作用,然后将知识应用到您的实际应用程序中。
  • 我确实在 initLabels() 中调用了 setText。我也在调用initListeVehicule() 之后调用此过程。

标签: java swing actionlistener jcombobox


【解决方案1】:

我一直在尝试直接通过 actionListener 更改值的方法,

您不直接调用 ActionListener。将 ActionListener 添加到组合框后,您可以调用:

  1. setSelectedItem(...)
  2. setSelectedIndex(...)

在组合框上,组合框将调用ActionListener

【讨论】:

  • setSelectedItem 或 Index 与此有什么关系?请不要对我低语,我有多个使用 JComboBox 和 actionListener 的实例,但这是我第一次尝试进行动态处理。在过去的 2 天里,我已经阅读了教程并观看了视频,但仍然无法正常工作。你一直在误解我的话——仔细阅读。
  • You keep misinterpretating what I say -- read carefully. - 我已经回答了数千个问题,并且大致了解人们在问什么。如果我的建议没有帮助,那是因为 1)您的问题不清楚或 2)您不理解我的建议。同样,这也是发布正确minimal reproducible example 的原因。它迫使您简化问题,以便每个人都可以准确地看到您在做什么并执行代码以阐明正在发生的事情。
  • What does setSelectedItem or Index have to do with this? - 我在猜测您真正要问的是什么,因为您发布的代码表明您并不真正知道自己在做什么。 this is the first i'm attempting to do dynamic processing. - 你似乎不明白什么是动态处理。再次澄清这些误解的方法是提出一个适当的问题和一个适当的MCVE 来证明问题。
【解决方案2】:

经过几个小时的干预,我找到了解决方案。我刚刚将创建标签的过程集成到 initListeVehicule 中,ActionListener 可以从那里访问标签以修改其文本。

public void initListeVehiculeInfos(){

    vehicules = new String[] {Constantes.CS100 , Constantes.CS300 , 
            Constantes.GREYHOUND102D3 , Constantes.GREYHOUNDG4500 , 
            Constantes.TGVATLANTIQUE , Constantes.TGVDUPLEX};

    final JComboBox<String> vehiculesList = new JComboBox<>(vehicules);
    add(vehiculesList,BorderLayout.NORTH);

    JPanel panneauBas = panelGenerator();
    //these setTexts serve as default values before doing your first selection

    final JLabel carb = labelGenerator();
    carb.setText("Carburant: Kérosène");

    final JLabel passager = labelGenerator();
    passager.setText("Nb Passager: 110");


    vehiculesList.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e){
            InterfaceVehicules info = FabriqueVehicule.obtenirVehicule(vehiculesList.getSelectedIndex());
            carb.setText("Carburant: " + info.tabNomTypeCarburant[info.getTypeCarburant()] );
            passager.setText("Nb Passagers: " + info.getNbPassagersMax());
        }
    });

    panneauBas.add(carb);
    panneauBas.add(passager);

    add(panneauBas, BorderLayout.SOUTH);

}

【讨论】:

  • 标签和组合框应该定义为实例变量。然后可以通过类中的任何方法访问它们。
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
相关资源
最近更新 更多