java 下拉框级联及相关(转)

简介: ActionLintsner都实现此接口,其它监听器可以监听的事件都可以被它捕获 public interface ActionListener extends EventListenerThe listener interface for receiving action events.

 

ActionLintsner都实现此接口,其它监听器可以监听的事件都可以被它捕获

public interface ActionListener extends EventListener
The listener interface for receiving action events.
The class that is interested in processing an action event implements this interface, and the object created with that class is registered with a component, using the component's addActionListener method. When the action event occurs, that object's actionPerformed method is invoked.

actionPerformed(ActionEvent e)
          Invoked when an action occurs.

ItemListener用于捕获带有item的组件产生的事件,如ComboBox,CheckBox,RadioButton,ToggleButton,接口中定义的itemStateChanged(ItemEvent e)将执行需要在已选定(或已取消选定)项时发生的操作 

 public interface ItemListenerextends EventListenerThe listener interface for receiving item events.
The class that is interested in processing an item event implements this interface. The object created with that class is then registered with a component using the component's addItemListener method. When an item-selection event occurs, the listener object's itemStateChanged method is invoked.

void itemStateChanged(ItemEvent e)
Invoked when an item has been selected or deselected by the user. The code written for this method performs the operations that need to occur when an item is selected (or deselected).

 

package swing.combox;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class YearMonthDay extends JFrame {

    private static final long serialVersionUID = 1L;
    private final int STARTYEAR = 2000;//年份的开始值
     private final int ENDYEAR = 2020;//年份的结束值
     
     JPanel contentPane;
     //年月日的选择框
     JComboBox<String> 
      cboYear = new JComboBox<String>(),
      cboMonth = new JComboBox<String>(),
      cboDay = new JComboBox<String>();
     
     //年月日标签
     JLabel jLabel1 = new JLabel();
     JLabel jLabel2 = new JLabel();
     JLabel jLabel3 = new JLabel();
     public YearMonthDay() {
      
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       jbInit();
      
     }
     private void jbInit(){
      
      contentPane = (JPanel) getContentPane();
      contentPane.setLayout(null);
      setSize(new Dimension(400, 300));
      setTitle("年月日下拉列表级联");
      // 年的下拉选择框
      cboYear.setFont(new java.awt.Font("Dialog", Font.BOLD, 13));
      cboYear.setBounds(new Rectangle(0, 0, 55, 18));
      // 月的下拉选择框
      cboMonth.setFont(new java.awt.Font("Dialog", Font.BOLD, 13));
      cboMonth.setBounds(new Rectangle(80, 0, 45, 18));
      cboMonth.addItemListener(new DateItemAdapter(this));
//      cboMonth
      // 日的下拉选择框
      cboDay.setFont(new java.awt.Font("Dialog", Font.BOLD, 13));
      cboDay.setBounds(new Rectangle(150, 0, 45, 18));
      // cboDay.setEditable(true);
      // 年的label
      jLabel3.setFont(new java.awt.Font("Dialog", Font.BOLD, 15));
      jLabel3.setText("年");
      jLabel3.setBounds(new Rectangle(60, 0, 20, 20));
      // 月的label
      jLabel2.setFont(new java.awt.Font("Dialog", Font.BOLD, 15));
      jLabel2.setText("月");
      jLabel2.setBounds(new Rectangle(130, 0, 20, 20));
      // 日的label
      jLabel1.setFont(new java.awt.Font("Dialog", Font.BOLD, 15));
      jLabel1.setText("日");
      jLabel1.setBounds(new Rectangle(200, 0, 20, 20));
      
      contentPane.add(cboYear);
      contentPane.add(cboMonth);
      contentPane.add(cboDay);
      contentPane.add(jLabel3);
      contentPane.add(jLabel2);
      contentPane.add(jLabel1);
      
      //添加初始值
      AddInfo();
     }
     
     private void AddInfo() {
      //年下拉选择框
      for (int i = STARTYEAR; i < ENDYEAR; i++) {
       cboYear.addItem("" + i);
      }
      
      //月下拉选择框
      for (int i = 0; i < 12; i++) {
       cboMonth.addItem("" + (i + 1));
      }
      
      //日下拉选择框
      for (int j = 0; j < 31; j++) {
       cboDay.addItem("" + (j + 1));
      }
     }
     public void cboMonth_itemStateChanged(ItemEvent e) {
      
      Object obj = cboMonth.getSelectedItem();// 取得选中月份
      
      if (obj != null) { 
       cboDay.removeAllItems();// 清空日的下拉列表框
       
       int month = Integer.valueOf(obj.toString());
       if (month==5) {//test  JComboBox api combox method setEnabled()
        this.cboDay.setEnabled(false);
    }
       int days = 31;
       if (month == 4 || month == 6 || month == 9 || month == 11) {
        days = 30;
       } else if (month == 2) {
         //取得选中年份
        int year = Integer.parseInt(cboYear.getSelectedItem()
          .toString());
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
         // 是闰年
         days = 29;
        } else {
         // 不是闰年
         days = 28;
        }
       }//if
       
       for (int j = 0; j < days; j++) {
        cboDay.addItem("" + (j + 1));
       }//for
      }//if
     }//if
     
    }//end class

// 事件监听器
class DateItemAdapter implements ItemListener {
 private YearMonthDay adaptee;
 DateItemAdapter(YearMonthDay adaptee) {
  this.adaptee = adaptee;
 }
 public void itemStateChanged(ItemEvent e) {
     if (e.getStateChange()==ItemEvent.SELECTED) {
         System.out.println("was invoked");
         adaptee.cboMonth_itemStateChanged(e);
    }
 }
}
package swing.combox;

public class Test {

     public static void main(String[] args) {
         YearMonthDay testDate = new YearMonthDay();
         testDate.setVisible(true);
         testDate.setBounds(200, 200, 250, 100);

    }
}

 

http://blog.sina.com.cn/s/blog_5f20c4740100e3xk.html

 

 

JComboBox ItemListener监听器

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JComboBox;

class itemListener implements ItemListener {

public void itemStateChanged(ItemEvent e) {

   if (e.getStateChange() == ItemEvent.SELECTED) {
    JComboBox jcb = (JComboBox) e.getSource();

    System.out.println((String) (jcb.getSelectedItem()));
    System.out.println(jcb.getSelectedIndex());
   } else {

   }

}

}

       今天用到了JComboBox的事件监听类 ItemListener,程序在执行时发现事件总是被触发两次,上网看了些资料,原来和ItemListener类中的方法itemStateChanged()事件的itemState有关,itemState在这里的状态有两个,Selected 和 deSelected(即选中和未被选中),所以,当改变下拉列表中被选中的项的时候,其实是触发了两次事件,第一次是上次被选中的项的 State 由 Selected 变为 deSelected ,即取消选择, 第二次是本次被选中的项的 State 由 deSelected 变为 Selected ,即新选中,所以,必然的 ItemStateChanged 事件中的代码要被执行两次了。

解决方法 就是:
  if(e.getStateChange() == ItemEvent.SELECTED){
  //要执行的代码
  }
  即为当事件是选中某一项的时候,才执行该代码。

http://ribbonchen.blog.163.com/blog/static/118316505200988105942563/

(总结)Swing组件的使用---下拉式菜单(menu),弹出式菜单(JPopupMenu),选项卡窗体(JTabbedPane)

http://blog.csdn.net/lyxaiclr/article/details/7391318

 

 

 

 

相关文章
|
9天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
9天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第9天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细解析Java中的同步机制,包括synchronized关键字、Lock接口以及并发集合等,并探讨它们如何影响程序的性能。此外,我们还将讨论Java内存模型,以及它如何影响并发程序的行为。最后,我们将提供一些实用的并发编程技巧和最佳实践,帮助开发者编写出既线程安全又高效的Java程序。
22 3
|
12天前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
【4月更文挑战第6天】Java中的`synchronized`关键字用于处理多线程并发,确保共享资源的线程安全。它可以修饰方法或代码块,实现互斥访问。当用于方法时,锁定对象实例或类对象;用于代码块时,锁定指定对象。过度使用可能导致性能问题,应注意避免锁持有时间过长、死锁,并考虑使用`java.util.concurrent`包中的高级工具。正确理解和使用`synchronized`是编写线程安全程序的关键。
|
10天前
|
Java
Java 并发编程:深入理解线程池
【4月更文挑战第8天】本文将深入探讨 Java 中的线程池技术,包括其工作原理、优势以及如何使用。线程池是 Java 并发编程的重要工具,它可以有效地管理和控制线程的执行,提高系统性能。通过本文的学习,读者将对线程池有更深入的理解,并能在实际开发中灵活运用。
|
9天前
|
算法 Java 开发者
Java中的多线程编程:概念、实现与性能优化
【4月更文挑战第9天】在Java编程中,多线程是一种强大的工具,它允许开发者创建并发执行的程序,提高系统的响应性和吞吐量。本文将深入探讨Java多线程的核心概念,包括线程的生命周期、线程同步机制以及线程池的使用。接着,我们将展示如何通过继承Thread类和实现Runnable接口来创建线程,并讨论各自的优缺点。此外,文章还将介绍高级主题,如死锁的预防、避免和检测,以及如何使用并发集合和原子变量来提高多线程程序的性能和安全性。最后,我们将提供一些实用的性能优化技巧,帮助开发者编写出更高效、更稳定的多线程应用程序。
|
7天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
11天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第7天】在现代软件开发中,多线程编程已经成为一种不可或缺的技术。为了提高程序性能和资源利用率,Java提供了线程池这一强大工具。本文将深入探讨Java线程池的原理、使用方法以及如何根据实际需求定制线程池,帮助读者更好地理解和应用线程池技术。
15 0
|
1天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
7 1
|
3天前
|
设计模式 运维 安全
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第15天】在Java开发中,多线程编程是提升应用程序性能和响应能力的关键手段。然而,它伴随着诸多挑战,尤其是在保证线程安全的同时如何避免性能瓶颈。本文将探讨Java并发编程的核心概念,包括同步机制、锁优化、线程池使用以及并发集合等,旨在为开发者提供实用的线程安全策略和性能优化技巧。通过实例分析和最佳实践的分享,我们的目标是帮助读者构建既高效又可靠的多线程应用。