现有一个表格有三列,
第一列中绑定一个JComboBox
第二列中也绑定一个JComboBox
当我选中某一行中的第一列时,这一行的第二列中的JComboBox值要随着变化,并且第二列中的值根据第一列中选择的值不同而不同.
比如:第一列中的值有:半成品,成品 这两个值,当我选择"半成品"时,第二列的JComboBox中的值为:集成电子,芯片,主板 这三个值,当选择"成品"时,第二列JComboBox中的值为:台式电脑,笔记本电脑 这两个值,请问各位该如何来实现这种效果,还望各位帮忙,能给我提借实现的代码,本人非常感谢你!
第一列中绑定一个JComboBox
第二列中也绑定一个JComboBox
当我选中某一行中的第一列时,这一行的第二列中的JComboBox值要随着变化,并且第二列中的值根据第一列中选择的值不同而不同.
比如:第一列中的值有:半成品,成品 这两个值,当我选择"半成品"时,第二列的JComboBox中的值为:集成电子,芯片,主板 这三个值,当选择"成品"时,第二列JComboBox中的值为:台式电脑,笔记本电脑 这两个值,请问各位该如何来实现这种效果,还望各位帮忙,能给我提借实现的代码,本人非常感谢你!
//希望对你有所帮助.
//多点看Swing的源代码,是一个很好的体系,很标准化
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableComboBoxTest extends javax.swing.JFrame {
private JTable table;
private JComboBox comboBox1;
private JComboBox comboBox2;
private Object[] list1,list2; public static void main(String[] args) {
TableComboBoxTest inst = new TableComboBoxTest();
inst.setVisible(true);
}
public TableComboBoxTest() {
super();
comboBox1=new JComboBox(new String[] {"半成品","成品"});
comboBox1.setSelectedIndex(0);
list1=new String[] {"集成电子","芯片","主板"};
list2=new String[] {"台式电脑","笔记本电"};
comboBox2=new JComboBox(list1);
//actions
comboBox1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(comboBox1.getSelectedItem().equals("半成品")) {;
comboBox2.setModel(new DefaultComboBoxModel(list1));
}else {
comboBox2.setModel(new DefaultComboBoxModel(list2));
}
}
});
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
{
JScrollPane jScrollPane1 = new JScrollPane();
getContentPane().add(jScrollPane1, BorderLayout.CENTER);
{
TableModel jTable1Model = new DefaultTableModel(new String[][] { { "One", "Two" },
{ "Three", "Four" } }, new String[] { "Column 1", "Column 2" });
table = new JTable();
jScrollPane1.setViewportView(table);
table.setModel(jTable1Model);
table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(comboBox1));
table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(comboBox2));
}
}
pack();
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}}
就是当你在第一行第一列选择"成品"时,
第一行第二列中的JComboBox中的对应值是"台式电脑","笔记本电脑"
第二行第一列选择"半成品"时,
第二行第二列中的JComboBox中的对应值是"集成电子","芯片","主板"现有你给的程序是当选择其中一个时,第二列的值是变化了,但是你不去选择第一列的值时,第一行第二列和第二行第二列的值都是一样的.
本以为DefaultTableCellRenderer能够解决问题,
可好像有点问题。
当然还得谢谢Jerrylove(Jerry)。import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.Vector;public class TestJComboBox extends javax.swing.JFrame {
private JTable table; private Object[] list11 = {"半成品", "成品"};
private JComboBox comboBox1; private Object[] list21 = {"集成电子", "芯片", "主板"};
private Object[] list22 = {"台式电脑", "笔记本电"};
private JComboBox comboBox2; public static void main(String[] args) {
TestJComboBox inst = new TestJComboBox();
inst.setVisible(true);
} public TestJComboBox() {
super();
comboBox1 = new JComboBox(list11);
comboBox2 = new JComboBox(list21); comboBox2.addPopupMenuListener(new PopupMenuListener(){
public void popupMenuWillBecomeVisible(PopupMenuEvent e){
int editRow = table.getEditingRow();
int editCol = table.getEditingColumn();
Object pvalue = table.getValueAt(editRow, 0); if (pvalue==list11[0]) {
//这种方式个人认为不太好,多开很多对象
comboBox2.setModel(new DefaultComboBoxModel(list21));
}
else {
comboBox2.setModel(new DefaultComboBoxModel(list22));
} };
public void popupMenuWillBecomeInvisible(PopupMenuEvent e){};
public void popupMenuCanceled(PopupMenuEvent e){};
}); initGUI();
} private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); JScrollPane jScrollPane1 = new JScrollPane();
getContentPane().add(jScrollPane1, BorderLayout.CENTER); TableModel jTable1Model = new DefaultTableModel(
new String[][] { {"00", "01"},{"00", "01"},{"00", "01"}},
new String[] {"Column 1", "Column 2"});
table = new JTable(jTable1Model);
jScrollPane1.setViewportView(table); table.getColumnModel().getColumn(0).setCellEditor(
new DefaultCellEditor(comboBox1));
table.getColumnModel().getColumn(1).setCellEditor(
new DefaultCellEditor(comboBox2)); pack();
setSize(400, 300);
}
catch (Exception e) {
e.printStackTrace();
}
}}