import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;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;
import javax.swing.table.TableColumnModel;public class Test extends JFrame {
private JTable table;
private DefaultTableModel cardModel;
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test frame = new Test();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
* Create the frame
*/
public Test() {
super();
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, BorderLayout.CENTER); table = new JTable();
scrollPane.setViewportView(table);
//
initTable();
tableVal();
table.addMouseListener(new MouseSelect());
}
private void initTable(){
cardModel = new DefaultTableModel(6,3);
table.setModel(cardModel);
table.getColumnModel().getColumn(0).setHeaderValue("1");
table.getColumnModel().getColumn(1).setHeaderValue("2");
table.getColumnModel().getColumn(2).setHeaderValue("3");
table.setRowHeight(25);
}
public void tableVal() {
String[] content={"性别","星期"};
JComboBox contentType = new JComboBox();
for(int i=0;i<content.length;i++){
contentType.addItem(content[i]);
}
DefaultCellEditor contentcell = new DefaultCellEditor(contentType);
TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(0).setCellEditor(contentcell);
}
private class MouseSelect implements MouseListener { @Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
Object target = e.getSource();
if (target instanceof JTable) {
int row=table.getSelectedRow();
int col=table.getSelectedColumn();
String name=table.getValueAt(row, col).toString();
if(col==0){
if(name.equals("性别")){
String[] data={"男","女"};
JComboBox dataBox = new JComboBox();
for(int i=0;i<data.length;i++){
dataBox.addItem(data[i]);
}
DefaultCellEditor dataCell = new DefaultCellEditor(dataBox);
TableColumnModel dataTcm = table.getColumnModel();
dataTcm.getColumn(1).setCellEditor(dataCell);
}
if(name.equals("星期")){
String[] date={"星期1","星期2","星期3","星期4"};
JComboBox dateBox = new JComboBox();
for(int i=0;i<date.length;i++){
dateBox.addItem(date[i]);
}
DefaultCellEditor dateCell = new DefaultCellEditor(dateBox);
TableColumnModel dateTcm = table.getColumnModel();
dateTcm.getColumn(1).setCellEditor(dateCell);
}
}
}
} @Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
} @Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
} @Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
} @Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
}想实现的功能是: 点击JTable的任意行第一列“性别”时 第二列的该行显示“男”“女”
点击“星期”时,显示"星期1","星期2","星期3","星期4"
不要拘泥上面的例子,寻找好的方法 代码最好稳定 高效 简洁 ...
http://www.java2s.com/CN/Code/Java/Swing-Components/EachRowwithdifferentEditorExample.htm
我的压缩包里面不止一两样东西哦,那可是我当初学习的所有资料。
http://download.csdn.net/user/yangtonghai
点击JTable的任意行第一列“性别”时 第二列的该行以ComboBox形式显示“男”“女”
点击“星期”时,以ComboBox形式显示"星期1","星期2","星期3","星期4"
try {
Thread.sleep(1000);
table.repaint();
} catch (InterruptedException e1) {
//e1.printStackTrace();
}
package ui;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.TableColumnModel;public class Test extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private JButton btnAdd;
private JButton btnDel;
private JScrollPane splT;
private JTable tblMain;
private JComboBox contentType;
private JComboBox cboItem;
private String[] content;
private String[] sex;
private String[] weekDay;
private TableModel myModel;
TableColumnModel tcm;
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Test().setVisible(true);
}
});
}
public Test() {
initComponents();
} private void initComponents() {
String[] headText={"Title","Item"};
myModel=new TableModel(headText); splT = new JScrollPane();
tblMain = new JTable(myModel);
btnAdd = new JButton("Add");
btnDel=new JButton("Delete");
btnAdd.addActionListener(this);
btnDel.addActionListener(this); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); splT.setViewportView(tblMain);
content=new String[]{"性别","星期"};
sex=new String[]{"女","男"};
weekDay=new String[]{"星期1","星期2","星期3","星期4","星期5","星期6","星期7"};
contentType = new JComboBox(content);
cboItem=new JComboBox();
tcm = tblMain.getColumnModel();
tcm.getColumn(0).setCellEditor(new DefaultCellEditor(contentType));
tcm.getColumn(1).setCellEditor(new DefaultCellEditor(cboItem));
contentType.addActionListener(this); GroupLayout layout = new GroupLayout(getContentPane());
getContentPane().setLayout(layout);
GroupLayout.SequentialGroup one=layout.createSequentialGroup();
one.addComponent(btnDel);
one.addComponent(btnAdd);
GroupLayout.SequentialGroup two=layout.createSequentialGroup();
two.addComponent(splT);
GroupLayout.ParallelGroup ot=layout.createParallelGroup();
ot.addGroup(two);
ot.addGroup(GroupLayout.Alignment.TRAILING, one);
layout.setHorizontalGroup(ot);
GroupLayout.ParallelGroup btnRow=layout.createParallelGroup();
btnRow.addComponent(btnDel);
btnRow.addComponent(btnAdd);
GroupLayout.SequentialGroup c1=layout.createSequentialGroup();
c1.addGroup(btnRow);
c1.addComponent(splT,188, 188,Short.MAX_VALUE);
GroupLayout.ParallelGroup c2=layout.createParallelGroup();
c2.addGroup(c1);
layout.setVerticalGroup(c2); pack();
} @Override
public void actionPerformed(ActionEvent e) {
Object target=e.getSource();
String[] content={null,null};
if(target.equals(btnAdd)){
myModel.addRow(content);
tblMain.updateUI();
}
else if(target.equals(contentType)){
String type=(String) contentType.getSelectedItem();
if(null!=type){
if(type.equals("性别")){
cboItem.removeAllItems();
cboItem.setModel(new DefaultComboBoxModel(sex));
}
else if(type.equals("星期")){
cboItem.removeAllItems();
cboItem.setModel(new DefaultComboBoxModel(weekDay));
}
}
}
else if(target.equals(btnDel)){
myModel.removeRow(tblMain.getSelectedRow());
tblMain.updateUI();
}
}
}package ui;import java.util.Vector;import javax.swing.table.AbstractTableModel;public class TableModel extends AbstractTableModel{
private static final long serialVersionUID = 1L; private Vector<Vector<String>> table = null; private String[] head = null;
public TableModel(String[] headText){
this.head=headText;
table=new Vector<Vector<String>>();
}
public void addRow(String[] value){
Vector<String> v=new Vector<String>();
for(int i=0;i<value.length;i++){
v.add(value[i]);
}
table.add(v);
}
public void removeRow(int index){
if(index<table.size()){
table.remove(index);
}
}
public void editValue(int row,int column,String value){
if(this.table.size()>row){
table.get(row).remove(column);
table.get(row).add(column, value);
this.fireTableCellUpdated(row, column);
}
}
public String[] getOneColumn(int columnIndex){
String[] columnData=new String[table.size()];
for(int i=0;i<table.size();i++){
columnData[i]=table.get(i).get(columnIndex);
}
return columnData;
}
public String[] getOneRow(int rowIndex){
return table.get(rowIndex).toArray(new String[0]);
}
public boolean containRow(String skill){
for(int i=0;i<table.size();i++){
if(table.get(i).get(0).equals(skill)){
return true;
}
}
return false;
}
@Override
public String getColumnName(int columnIndex) {
return head[columnIndex];
} @Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
} @Override
public int getColumnCount() {
return head.length;
} @Override
public int getRowCount() {
return table.size();
} @Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if(null!=aValue){
table.get(rowIndex).remove(columnIndex);
table.get(rowIndex).add(columnIndex, aValue.toString());
this.fireTableCellUpdated(rowIndex, columnIndex);
}
} @Override
public String getValueAt(int rowIndex, int columnIndex) {
if(table.size()>rowIndex){
return table.get(rowIndex).get(columnIndex);
}
return "";
}}
import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;public class Test23 extends JFrame { private JTable table; private DefaultTableModel cardModel; /**
* Launch the application
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test23 frame = new Test23();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
* Create the frame
*/
public Test23() {
super();
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, BorderLayout.CENTER); table = new JTable();
scrollPane.setViewportView(table);
//
initTable();
tableVal();
// table.addMouseListener(new MouseSelect());
} private void initTable() {
cardModel = new DefaultTableModel(6, 3);
table.setModel(cardModel);
table.getColumnModel().getColumn(0).setHeaderValue("1");
table.getColumnModel().getColumn(1).setHeaderValue("2");
table.getColumnModel().getColumn(2).setHeaderValue("3");
table.setRowHeight(25);
} public void tableVal() {
String[] content = { "性别", "星期" };
JComboBox contentType = new JComboBox();
for (int i = 0; i < content.length; i++) {
contentType.addItem(content[i]);
}
DefaultCellEditor contentcell = new DefaultCellEditor(contentType);
contentcell.addCellEditorListener(new MouseSelect());
TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(0).setCellEditor(contentcell); } private class MouseSelect implements CellEditorListener { public void editingCanceled(ChangeEvent e) { } public void editingStopped(ChangeEvent e) {
Object target = e.getSource();
if (target instanceof DefaultCellEditor) {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
String name = "";
try {
name = table.getValueAt(row, col).toString();
}
catch (Exception e1) { }
if (col == 0) {
if (name.equals("性别")) {
String[] data = { "男", "女" };
JComboBox dataBox = new JComboBox();
for (int i = 0; i < data.length; i++) {
dataBox.addItem(data[i]);
}
DefaultCellEditor dataCell = new DefaultCellEditor(dataBox);
TableColumnModel dataTcm = table.getColumnModel();
dataTcm.getColumn(1).setCellEditor(dataCell);
}
if (name.equals("星期")) {
String[] date = { "星期1", "星期2", "星期3", "星期4" };
JComboBox dateBox = new JComboBox();
for (int i = 0; i < date.length; i++) {
dateBox.addItem(date[i]);
}
DefaultCellEditor dateCell = new DefaultCellEditor(dateBox);
TableColumnModel dateTcm = table.getColumnModel();
dateTcm.getColumn(1).setCellEditor(dateCell);
}
}
}
} } public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub } public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub } public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub } public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}回复的有点晚啊,周五看了一下,没时间弄了,就拖到今天了。在你那个例子的基础上进行了修改,我当然看到你所说的“不要拘泥于例子”,但还是这样拘泥了……