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

本文介绍了如何在Java中实现下拉框的级联效果,通过ActionListener和ItemListener监听事件,特别是ItemListener在ComboBox中的应用。示例代码展示了年月日选择框的级联更新,当月选择发生变化时,根据月份动态更新天数。同时,文章还提到了ItemListener的itemStateChanged方法会因选中和取消选中触发两次事件的问题及解决办法。
摘要由CSDN通过智能技术生成

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).

packageswing.combox;importjava.awt.Dimension;importjava.awt.Font;importjava.awt.Rectangle;importjava.awt.event.ItemEvent;importjava.awt.event.ItemListener;importjavax.swing.JComboBox;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;public class YearMonthDay extendsJFrame {private static final long serialVersionUID = 1L;private final int STARTYEAR = 2000;//年份的开始值

private final int ENDYEAR = 2020;//年份的结束值

JPanel contentPane;//年月日的选择框

JComboBoxcboYear= new JComboBox(),

cboMonth= new JComboBox(),

cboDay= new JComboBox();//年月日标签

JLabel jLabel1 = newJLabel();

JLabel jLabel2= newJLabel();

JLabel jLabel3= newJLabel();publicYearMonthDay() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jbInit();

}private voidjbInit(){

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 voidAddInfo() {//年下拉选择框

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 voidcboMonth_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 implementsItemListener {privateYearMonthDay adaptee;

DateItemAdapter(YearMonthDay adaptee) {this.adaptee =adaptee;

}public voiditemStateChanged(ItemEvent e) {if (e.getStateChange()==ItemEvent.SELECTED) {

System.out.println("was invoked");

adaptee.cboMonth_itemStateChanged(e);

}

}

}

packageswing.combox;public classTest {public static voidmain(String[] args) {

YearMonthDay testDate= newYearMonthDay();

testDate.setVisible(true);

testDate.setBounds(200, 200, 250, 100);

}

}

JComboBox ItemListener监听器

import java.awt.event.ItemEvent;

import java.awt.event.ItemListener;

import javax.swing.JComboBox;

class itemListener implements ItemListener {

public voiditemStateChanged(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){

//要执行的代码

}

即为当事件是选中某一项的时候,才执行该代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现多个单元格下拉框级联最常见的方式是使用数据验证和VLOOKUP函数。以下是一个通用的Java代码实现示例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class ExcelDropdownCascadeExample { public static void main(String[] args) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 第一列下拉框数据 String[] column1Values = new String[]{"A1", "A2", "A3", "A4"}; // 第一列数据验证 DataValidationHelper validationHelper = sheet.getDataValidationHelper(); CellRangeAddressList column1RangeAddressList = new CellRangeAddressList(1, 100, 0, 0); DataValidationConstraint column1Constraint = validationHelper.createExplicitListConstraint(column1Values); DataValidation column1Validation = validationHelper.createValidation(column1Constraint, column1RangeAddressList); sheet.addValidationData(column1Validation); // 第二列下拉框数据 String[] column2ValuesA1 = new String[]{"B1", "B2", "B3"}; String[] column2ValuesA2 = new String[]{"C1", "C2", "C3"}; String[] column2ValuesA3 = new String[]{"D1", "D2", "D3"}; String[] column2ValuesA4 = new String[]{"E1", "E2", "E3"}; // 第二列数据验证 CellRangeAddressList column2RangeAddressList = new CellRangeAddressList(1, 100, 1, 1); DataValidationConstraint column2Constraint = validationHelper.createFormulaListConstraint("INDIRECT($A1&\"_values\")"); DataValidation column2Validation = validationHelper.createValidation(column2Constraint, column2RangeAddressList); sheet.addValidationData(column2Validation); // 第一列对应的下拉框数据 Name column2ValuesA1Name = workbook.createName(); column2ValuesA1Name.setNameName("A1_values"); column2ValuesA1Name.setRefersToFormula("Sheet1!$G$1:$G$3"); sheet.createRow(0).createCell(6).setCellValue(column2ValuesA1[0]); sheet.createRow(1).createCell(6).setCellValue(column2ValuesA1[1]); sheet.createRow(2).createCell(6).setCellValue(column2ValuesA1[2]); Name column2ValuesA2Name = workbook.createName(); column2ValuesA2Name.setNameName("A2_values"); column2ValuesA2Name.setRefersToFormula("Sheet1!$H$1:$H$3"); sheet.createRow(0).createCell(7).setCellValue(column2ValuesA2[0]); sheet.createRow(1).createCell(7).setCellValue(column2ValuesA2[1]); sheet.createRow(2).createCell(7).setCellValue(column2ValuesA2[2]); Name column2ValuesA3Name = workbook.createName(); column2ValuesA3Name.setNameName("A3_values"); column2ValuesA3Name.setRefersToFormula("Sheet1!$I$1:$I$3"); sheet.createRow(0).createCell(8).setCellValue(column2ValuesA3[0]); sheet.createRow(1).createCell(8).setCellValue(column2ValuesA3[1]); sheet.createRow(2).createCell(8).setCellValue(column2ValuesA3[2]); Name column2ValuesA4Name = workbook.createName(); column2ValuesA4Name.setNameName("A4_values"); column2ValuesA4Name.setRefersToFormula("Sheet1!$J$1:$J$3"); sheet.createRow(0).createCell(9).setCellValue(column2ValuesA4[0]); sheet.createRow(1).createCell(9).setCellValue(column2ValuesA4[1]); sheet.createRow(2).createCell(9).setCellValue(column2ValuesA4[2]); FileOutputStream outputStream = new FileOutputStream("example.xlsx"); workbook.write(outputStream); workbook.close(); } } ``` 在这个示例中,我们使用了Apache POI库来创建一个Excel文档,并在第一列添加了一个下拉框,用于选择A1,A2,A3或A4。在第二列中,我们使用了VLOOKUP函数来根据第一列的选择动态更新下拉框数据。我们还使用了命名区域来定义每个下拉框的数据范围。 请注意,这个示例中的代码仅仅是一个通用的实现,真正的实现可能会因为具体的业务需求而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值