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"  
不要拘泥上面的例子,寻找好的方法  代码最好稳定  高效  简洁  ...

解决方案 »

  1.   

    你的需求实现在这里,基本原模原样
    http://www.java2s.com/CN/Code/Java/Swing-Components/EachRowwithdifferentEditorExample.htm
      

  2.   

    能把代码看完的,已经很佩服了。看到这堆swing的代码 头疼。只能祝你好运了
      

  3.   

    这个监听TableModel 然后控制一下编辑器就行啦
      

  4.   

    想要相关语言的所有资料吗?那就快来吧。
    我的压缩包里面不止一两样东西哦,那可是我当初学习的所有资料。
    http://download.csdn.net/user/yangtonghai
      

  5.   


    点击JTable的任意行第一列“性别”时 第二列的该行以ComboBox形式显示“男”“女”
    点击“星期”时,以ComboBox形式显示"星期1","星期2","星期3","星期4"   
      

  6.   

    你用2个隐藏的button,width,hight,borderWidth都为0. button_Click触发绑定数据,1个绑定“性别”,1个绑定“星期”.
      

  7.   

    想随便选一项刷新一下,失败唉,功夫不行啊  哎~~dataBox.setSelectedItem(1);
    try {
    Thread.sleep(1000);
    table.repaint();
    } catch (InterruptedException e1) {

    //e1.printStackTrace();
    }

      

  8.   


    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 "";
    }}
      

  9.   

    看上去我的布局有点麻烦 但是这种布局其实挺好的 因为那是自动化的  其次 虽然一点小功能就写个模板类有点小题大作 但是我相信  要用table的话  总有一天要这样做的 希望对妹子有点帮助
      

  10.   

    package com.esen.chenf.test;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.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
    }
    }回复的有点晚啊,周五看了一下,没时间弄了,就拖到今天了。在你那个例子的基础上进行了修改,我当然看到你所说的“不要拘泥于例子”,但还是这样拘泥了……
      

  11.   

    超额完成  呵呵 我做的 和你的基本一样 我原先继承DefaultTable 最后改成AbstractTable 谢谢你啦 给你70分吧 其他人也分一杯羹吧 嘿嘿..