[英]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);
}
});
不能工作有兩個原因;
JButton
沒有提供static
方法addActionListener
,因此將無法編譯... 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.