簡體   English   中英

搖擺Java ActionListener

[英]Swing Java ActionListener

我一直試圖在框架上顯示一條消息,說“已選擇汽車”。 我一直在嘗試解決此問題,但我不知道該如何幫助任何人?

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class SelectWindow extends JFrame implements ItemListener {

    public static void main(String[] args) {
        new SelectWindow();
    }
    Map<String, String[]> cars = new HashMap<String, String[]>();
    JComboBox brands;
    JComboBox models;

    public SelectWindow() {
        initCars();
        setTitle("Select a car");
        brands = new JComboBox();
        brands.addItem("<none>");
        for (String brand : cars.keySet()) {
            brands.addItem(brand);
        }
        brands.addItemListener(this);
        models = new JComboBox();
        models.setEnabled(false);
        models.addItemListener(this);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        c.add(new JLabel("Select a brand: "));
        c.add(brands);
        c.add(new JLabel("Select a model: "));
        c.add(models);
        c.add(new JButton("OK"));
        setVisible(true);
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getSource() == brands && e.getStateChange() == ItemEvent.SELECTED) {
            String[] items = cars.get(e.getItem());
            if (items == null) {
                models.removeAllItems();
                models.setEnabled(false);
            } else {
                models.removeAllItems();
                models.addItem("<none>");
                for (String item : items) {
                    models.addItem(item);
                }
                models.setEnabled(true);
            }
            JLabel texte = new JLabel("car was selected");
            JButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    texte.setVisible(true);
                }
            });
        }
    }

    private void initCars() {
        cars.put("Renault", new String[]{
            "Twingo", "Clio", "Modus", "Kangoo",
            "Mégane", "Sénic", "Laguna", "Expace"});
        cars.put("Peugeot", new String[]{
            "107", "206", "207", "308", "407",
            "508", "607"});
        cars.put("Citroën", new String[]{
            "C1", "C3", "C4 Picasso", "C5", "C6", "C8",
            "Berlingo", "DS3"});
    }
}

首先看一下如何使用按鈕,復選框和單選按鈕以及如何編寫動作偵聽器

按鈕通過ActionListener提供通知。 您需要使用按鈕注冊一個ActionListener實例,並在其中執行所需的操作

關於一個稍微高級的主題,但值得一讀的是如何使用操作 ,它提供了一個自包含的ActionListener ,還包含配置信息,按鈕可以使用這些配置信息,包括菜單項和按鍵綁定

這個...

JLabel texte = new JLabel("car was selected");
JButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        texte.setVisible(true);
    }
});

不能工作有兩個原因;

  1. JButton沒有提供static方法addActionListener ,因此將無法編譯...
  2. texte尚未添加到任何內容,因此嘗試使其不可見...

就個人而言,我將與其他UI一起初始化。

JLabel texte = new JLabel("car was selected");
JButton btn = new JButton("OK");
btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        texte.setVisible(true);
    }
});
c.add(btn);
c.add(texte);

現在,您可以使用itemStateChanged方法啟用/禁用按鈕,但是您需要使btn成為實例變量...

public class SelectWindow extends JFrame implements ItemListener {
    //...
    private JButton okBtn;
    //...
    public SelectWindow() {
        //...
        okBtn = new JButton("OK");
        okBtn.addActionListener(new ActionListener() {
            //...
        });
        c.add(okBtn);
        //...

這將允許您更改itemStateChanged按鈕的itemStateChanged

public void itemStateChanged(ItemEvent e) {
    //...
    okBtn.setEnabled(...);

例如...

側面注釋和評論

  • 通常,不建議從頂級容器(如JFrame擴展,而改用更常見的一級容器(如JPanel 這樣可以提高UI的可重用性,因為您不會將自己鎖定在單個頂級容器中,並且可以決定何時以及如何使用組件顯示,例如...

該按鈕上沒有任何響應,因為您沒有對它的引用,只是將其添加到“框架”而不對其進行引用。

問題:

c.add(new JButton("OK")); //wont have any reference

 button = new JButton("OK")
 c.add(button );

其中button全局變量

並在您的itemStateChanged方法中更改了

JButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                }
            });

button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });

注冊按鈕的actionListener的全局引用

我已經修改了您的代碼,現在可以使用了

 import java.awt.Container;
 import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.util.HashMap;
 import java.util.Map;
 import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 public class SelectWindow extends JFrame implements
 ItemListener {
     JButton button1;
     JLabel texte;
      Container c;
 public static void main(String[] args) {
 new SelectWindow();
 }

 Map<String, String[]> cars = new HashMap<String,
 String[]>();
 JComboBox brands;
 JComboBox models;
 public SelectWindow() {
 initCars();
 setTitle("Select a car");
 brands = new JComboBox();
 brands.addItem("<none>");
 for (String brand : cars.keySet()) {
 brands.addItem(brand);
 }
 brands.addItemListener(this);
 models = new JComboBox();
 models.setEnabled(false);
 models.addItemListener(this);
 texte = new JLabel("car was selected");
 texte.setVisible(false);
 button1 = new JButton("OK");

 button1.addActionListener(new ActionListener() {

     public void actionPerformed(ActionEvent arg0) {

         texte.setVisible(true);
        // c.add(texte);
     }
        });

 c = getContentPane();
 c.setLayout(new FlowLayout());
 c.add(new JLabel("Select a brand: "));
 c.add(brands);
 c.add(new JLabel("Select a model: "));
 c.add(models);
 c.add(button1);
 c.add(texte);
 setVisible(true);
 }
 @Override
 public void itemStateChanged(ItemEvent e) {
 if (e.getSource() == brands && e.getStateChange() == ItemEvent.SELECTED) {
   String[] items = cars.get(e.getItem());
 if (items == null) {
    models.removeAllItems();
     models.setEnabled(false);

 } else {
     models.removeAllItems();
     models.addItem("<none>");
 for (String item : items) {
     models.addItem(item);
 }
      models.setEnabled(true);

 }

 button1.setEnabled(true);



     }



 }
private void initCars() {
   cars.put("Renault", new String[] {
   "Twingo", "Clio", "Modus", "Kangoo",
     "Mégane", "Sénic", "Laguna", "Expace" });
cars.put("Peugeot", new String[] {
 "107", "206", "207", "308", "407",
 "508", "607" });
 cars.put("Citroën", new String[] {
 "C1", "C3", "C4 Picasso", "C5", "C6", "C8",
     "Berlingo", "DS3" });
   }
 }

讓我知道這是否是您想要的! 只需將按鈕,容器和文本更改為全局變量。 首先將標簽可見性設置為False,然后將其添加到容器中,然后在單擊Button時將其設置為True。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM