java Swing 在JTable表格单元中加入JComboBox下拉框,如何给单元格添加自定义下拉框?下拉选项动态变化。

在开发过程中,有时会遇到需要把表格单元格渲染成下拉框的情况,且下拉框中的数据是根据情况动态变化的。一般情况,对于这种情况,一般只需要设置编辑器即可,渲染器则可以不用设置。代码如下:

package com.a;

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

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Demo2 {

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		JTable table = new JTable();
		DefaultTableModel model = new DefaultTableModel();
		String[] columnIdentifiers = {"one", "two", "three"};//表头
		String[][] data = new String[5][3];
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 3; j++) {
				if(j == 2) {
					continue;
				}
				data[i][j] = "asd";
			}
		}
		model.setDataVector(data, columnIdentifiers);
		table.setModel(model);
		//强烈建议用Vector集合来作为下拉框的选项值,方便删除修改下拉框中选项值的内容。
		Vector<String> vector = new Vector<String>();
		vector.add("a");
		vector.add("b");
		vector.add("c");
		
		final JComboBox<String> comboBox = new JComboBox<String>(vector);
		//下拉框监听
		comboBox.addItemListener(new ItemListener() {
			
			@Override
			public void itemStateChanged(ItemEvent e) {
				if(e.getStateChange() == ItemEvent.SELECTED) {
					System.out.println(comboBox.getSelectedItem());
				}
			}
		});
		//表格编辑器
		table.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(comboBox));
		
		JScrollPane scrollPane = new JScrollPane(table);
		frame.add(scrollPane);
		frame.setBounds(100, 100, 300, 200);
		frame.setVisible(true);
	}
}

如果需要动态变化下拉框选项值的内容,修改Vector集合即可。

效果图如下:

点击单元格时才会看到下拉框,失去焦点后就是正常的单元格。

特别提醒:以上代码的内容,实际上第三列用的是同一个下拉框,所以,在进行下拉框监听的时候,如果上一行选中了下拉框第二项,下一行再选中同一项时,不会触发下拉框选项监听事件。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
很高兴为您解答问题。关于在JPanel创建具有下拉框和单选框的表格,可以使用JTableJComboBox、JRadioButton等Swing组件来实现。下面是相关的Java代码: ``` import javax.swing.*; import javax.swing.table.DefaultTableModel; public class TableDemo { public static void main(String[] args) { JFrame frame = new JFrame("Table Demo"); JPanel panel = new JPanel(); // 创建表格模型 DefaultTableModel tableModel = new DefaultTableModel(); tableModel.addColumn("姓名"); tableModel.addColumn("性别"); tableModel.addColumn("年龄"); // 添加行数据 tableModel.addRow(new Object[]{"张三", "男", 20}); tableModel.addRow(new Object[]{"李四", "女", 25}); // 创建表格 JTable table = new JTable(tableModel); // 设置下拉框 String[] genders = {"男", "女"}; JComboBox<String> genderBox = new JComboBox<>(genders); table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(genderBox)); // 设置单选框 JRadioButton maleRadio = new JRadioButton("男"); JRadioButton femaleRadio = new JRadioButton("女"); ButtonGroup bg = new ButtonGroup(); bg.add(maleRadio); bg.add(femaleRadio); table.getColumnModel().getColumn(1).setCellRenderer(new RadioButtonRenderer()); table.getColumnModel().getColumn(1).setCellEditor(new RadioButtonEditor(new JCheckBox())); // 把表格加到面板上 panel.add(new JScrollPane(table)); // 把面板加到窗口上 frame.getContentPane().add(panel); // 设置窗口的大小、位置和关闭方式 frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 显示窗口 frame.setVisible(true); } // 单选框渲染器 static class RadioButtonRenderer extends JRadioButton implements TableCellRenderer { public RadioButtonRenderer() { setOpaque(true); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); super.setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(table.getBackground()); } setSelected((value != null && ((String) value).equals(getText()))); return this; } } // 单选框编辑器 static class RadioButtonEditor extends DefaultCellEditor implements ItemListener { private JRadioButton button; public RadioButtonEditor(JCheckBox checkBox) { super(checkBox); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if (value == null) { return null; } button = new JRadioButton(); button.addItemListener(this); if (((String) value).equals("男")) { button.setSelected(true); } return button; } public Object getCellEditorValue() { return button.isSelected() ? "男" : "女"; } public void itemStateChanged(ItemEvent e) { super.fireEditingStopped(); } } } ``` 这段代码实现了一个简单的表格,其第二列可以选择男或女,也可以用下拉框来选择,效果如图所示: ![table-demo.png](https://img-blog.csdn.net/20170314110519260?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVycnkxOTk1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70) 希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值