Java 如何在Swing中的JTable列中添加不同的JComboBox项

Java 如何在Swing中的JTable列中添加不同的JComboBox项,java,swing,jtable,jcombobox,tablecellrenderer,Java,Swing,Jtable,Jcombobox,Tablecellrenderer,我想在第1列的JTable(3,3)中添加JComboBox。但是在第1列中,每行都有自己的ComboBox元素集。 当我尝试使用 table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(comboBox_Custom)); 每一行都被设置为同一组组合框值。 但是我希望每一行组合框都有不同的项。上的示例看起来是正确的,例如(我为快速示例编写了JComboxes,为今天的Swing添加/更改了代码) 只需添加

我想在第1列的JTable(3,3)中添加JComboBox。但是在第1列中,每行都有自己的ComboBox元素集。 当我尝试使用

table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(comboBox_Custom));
每一行都被设置为同一组组合框值。 但是我希望每一行组合框都有不同的项。

上的示例看起来是正确的,例如(我为快速示例编写了JComboxes,为今天的Swing添加/更改了代码)

只需添加每个工作流编辑器类

包com.atos.table.classes;
package com.atos.table.classes;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.HashMap;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;

public class PartCustomerWindow2 {
    public static final Object[][] DATA = { { 1, 2,3, 4,false }, { 5, 6,7, 8 ,true},{ 9, 10,11, 12,true }, { 13, 14,15, 16,true } };

    public static final String[] COL_NAMES = { "One", "Two", "Three", "Four",MyTableModel1.SELECT };

    JButton but = new JButton("Add");
    private JComboBox jcomboBox = null;
    private JTextField jTextField = null;

    static Object[][] rowData = null;
    private JTable table=null;
    static   JFrame frame = null;
    HashMap mp = null;
    static int count = 0;
    String content = null;


    public JTextField getjTextField() {
        if(jTextField == null)
        {
            jTextField =  new FMORestrictedTextField(FMORestrictedTextField.JUST_ALPHANUMERIC, 8);
        }

    mp = new HashMap();
        mp.put("arif",2);
        mp.put("8",6);
        mp.put("12",10);
        mp.put("14",16);
        mp.put("pk1",22);
        mp.put("pk3",23);

             jTextField.addKeyListener(new KeyAdapter() {

             public void keyReleased(KeyEvent event) {


                 if(count == 0)
                 content = jTextField.getText();
                // System.out.println(content);

                 if(mp.containsKey(content))
                 {
                     JFrame parent = new JFrame();

                     JOptionPane.showMessageDialog(parent, "Already Assigned"); 
                 }
                 }

         });
        return jTextField;
    }


    public void setjTextField(JTextField jTextField) {
        this.jTextField = jTextField;
    }


   public JComboBox getJcomboBox() {
       if(jcomboBox == null)
       {
           jcomboBox = new JComboBox();
       }
        return jcomboBox;
    }


    public void setJcomboBox(JComboBox jcomboBox) {
        this.jcomboBox = jcomboBox;
    }


private void createAndShowGui(PartCustomerWindow2 ob)
   {
     /*rowData  = new Object[DATA.length][];
      for (int i = 0; i < rowData.length; i++) {
         rowData[i] = new Object[DATA[i].length + 1];
         for (int j = 0; j < DATA[i].length; j++) {
            rowData[i][j] = DATA[i][j];
         }
         rowData[i][DATA[i].length] = Boolean.TRUE;
         if(i == 2 || i ==3)
             rowData[i][DATA[i].length] = Boolean.FALSE;
      }*/

      MyTableModel3 tableModel = new MyTableModel3(DATA, COL_NAMES, "My Table", ob);


      table = new JTable(tableModel);

      //table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

      /*table.addFocusListener(new java.awt.event.FocusAdapter() {
          public void focusLost(java.awt.event.FocusEvent evt) {
            table.getSelectionModel().clearSelection();
          }
        });*/

      TableColumnModel cm = table.getColumnModel();


      /*cm.getColumn(2).setCellEditor(new DefaultCellEditor(

                new JComboBox(new DefaultComboBoxModel(new String[] {
                 "Yes",
                  "No",
                  "Maybe"
                }))));*/
     /* String ar1[]= {"aa","aaa","aaaa"};
      ob.getJcomboBox().setModel(new DefaultComboBoxModel(ar1));*/
      cm.getColumn(2).setCellEditor(new DefaultCellEditor(

              ob.getJcomboBox()));


      cm.getColumn(3).setCellEditor(new DefaultCellEditor(

              ob.getjTextField()));


      JScrollPane scrollPane = new JScrollPane();
     /* scrollPane.add("Table",table);
      scrollPane.add("Button",but);*/

      JFrame frame2 =  new JFrame();
     /* jcomboBox.setPreferredSize(new Dimension(100,20));
      textField.setPreferredSize(new Dimension(100,20));
      jcomboBox.setEnabled(false);
      textField.setEnabled(false);
      */
      JScrollPane scrollPane2 = new JScrollPane(but);

      but.addActionListener(new ActionListener() {


        @Override
        public void actionPerformed(ActionEvent e) {
            if(table.getCellEditor() != null)
            table.getCellEditor().stopCellEditing();
            // TODO Auto-generated method stub
            String[][] ar = new String[table.getRowCount()][5];


            for(int i =0;i<table.getRowCount();i++)
            {
                for(int j=0;j<5;j++)
                {
                    DATA[i][j] = table.getValueAt(i,j);
                }

                System.out.print(table.getValueAt(i,0)+" ");
                System.out.print(table.getValueAt(i,1)+" ");
                System.out.print(table.getValueAt(i,2)+" ");
                System.out.print(table.getValueAt(i,3)+" ");
                System.out.println(table.getValueAt(i,4)+" ");
            }

        System.out.println("*******************");
        /*
            for(int i=0;i<DATA.length;i++)
            {
                System.out.print(DATA[i][0]);
                System.out.print(DATA[i][1]);
                System.out.print(DATA[i][2]);
                System.out.print(DATA[i][3]);
                boolean check =(Boolean) DATA[i][4];
                System.out.println(check);
            }*/

    }});


      frame = new JFrame("PartCustomerWindow2");
      //
      //JFrame frame = new JFrame();
      Container contentPane = frame.getContentPane();
      contentPane.setLayout(new BorderLayout());
      contentPane.add(new JScrollPane(table), BorderLayout.NORTH);
      contentPane.add(but);


      //
      //frame.setLayout(new FlowLayout());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     /* frame.getContentPane().add(scrollPane2);
      frame.getContentPane().add(scrollPane3);
      frame.getContentPane().add(scrollPane4);*/
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);


   }





public static void main(String[] args) {
       PartCustomerWindow2 ob = new PartCustomerWindow2();

       ob.createAndShowGui(ob);

   }
}



































@SuppressWarnings("serial")
class MyTableModel3 extends DefaultTableModel {
   public static final String SELECT = "select";
   String tablename;
   PartCustomerWindow2 ob = null;



   public MyTableModel3(Object[][] rowData, Object[] columnNames, String tableName,PartCustomerWindow2 ob) {
      super(rowData, columnNames);
      this.tablename = tableName;
      this.ob = ob;

   }

   @Override
   public Class<?> getColumnClass(int columnIndex) {
      if (getColumnName(columnIndex).equalsIgnoreCase(SELECT)) {

         return Boolean.class;
      }
      else

      return super.getColumnClass(columnIndex);
   }

   @Override
   public boolean isCellEditable(int row, int col) {
       JComboBox jb = ob.getJcomboBox();
       JTextField jt = ob.getjTextField();

       if(((Boolean) getValueAt(row, getColumnCount() - 1)).booleanValue())
       {

         //  jb.setEnabled(false);

          jb.removeAllItems();
          // System.out.println(jb.getItemCount());
          if(row == 0)
          {
             jb.addItem("arif");
              jb.addItem("asif");
               jb.addItem("ashik");
               jb.addItem("farooq");
               jb.addItem("adkh");

          }

          if(row > 0)
          {
             jb.addItem("kjhds");
               jb.addItem("sdds");
               jb.addItem("asdfsdk");
               jb.addItem("sdfsdf");
               jb.addItem("sdf");
          }

        /*HashMap mp = new HashMap();
        mp.put("arif",2);
        mp.put("8",6);
        mp.put("12",10);
        mp.put("14",16);
        mp.put("pk1",22);
        mp.put("pk3",23);
          */
        /* if(col == 3){

        if(mp.containsKey(jt.getText()))
          {
            System.out.println("Sorry..!! already assigned");
            jt.setFocusable(true);
          }

           jt.setText("");
           jt.setEnabled(false);
       }*/
       }
       else
       {
          // jb.setEnabled(true);
           //jt.setEnabled(true);
       }

       if (col == getColumnCount()-1 ) {

         return true;
       }
      else{
          if (getColumnName(4).equalsIgnoreCase(SELECT) && ((Boolean) getValueAt(row, getColumnCount() - 1)).booleanValue())
          {  
            //  jb.setEnabled(true);


             // jt.setEnabled(true);
              return (col == 2 || col == 3);

          }
          else{
             // jb.setEnabled(false);
              //jt.setEnabled(false);
              return false;
          }


      }

   }





}
导入java.awt.BorderLayout; 导入java.awt.Container; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入java.awt.event.KeyAdapter; 导入java.awt.event.KeyEvent; 导入java.util.HashMap; 导入javax.swing.DefaultCellEditor; 导入javax.swing.JButton; 导入javax.swing.JComboBox; 导入javax.swing.JFrame; 导入javax.swing.JOptionPane; 导入javax.swing.JScrollPane; 导入javax.swing.JTable; 导入javax.swing.JTextField; 导入javax.swing.table.DefaultTableModel; 导入javax.swing.table.TableColumnModel; 公共类PartCustomerWindows 2{ 公共静态最终对象[][]数据={{1,2,3,4,false},{5,6,7,8,true},{9,10,11,12,true},{13,14,15,16,true}; 公共静态最终字符串[]COL_NAMES={“一”、“二”、“三”、“四”,MyTableModel1.SELECT}; JButton,但=新JButton(“添加”); 私有JComboBox JComboBox=null; 私有JTextField JTextField=null; 静态对象[][]rowData=null; 私有JTable表=null; 静态JFrame=null; HashMap mp=null; 静态整数计数=0; 字符串内容=null; 公共JTextField getjTextField(){ if(jTextField==null) { jTextField=新的FMORestrictedTextField(FMORestrictedTextField.JUST_字母数字,8); } mp=新的HashMap(); 议员put(“arif”,2); 议员:付诸表决(“8”,6); 议员:付诸表决(“12”,10); 议员put(14,16);; 议员put(pk1,22);; 议员put(pk3,23);; addKeyListener(新的KeyAdapter(){ 公共无效密钥已释放(KeyEvent事件){ 如果(计数=0) content=jTextField.getText(); //系统输出打印项次(内容); if(mp.containsKey(内容)) { JFrame父对象=新JFrame(); showMessageDialog(父级,“已分配”); } } }); 返回jTextField; } 公共无效集合JTextField(JTextField JTextField){ this.jTextField=jTextField; } 公共JComboBox getJcomboBox(){ if(jcomboBox==null) { jcomboBox=新的jcomboBox(); } 返回jcomboBox; } 公共无效设置JComboBox(JComboBox JComboBox){ this.jcomboBox=jcomboBox; } 私有void createAndShowGui(PartCustomerWindow2 ob) { /*rowData=新对象[DATA.length][]; 对于(int i=0;i对于(int i=0;这篇文章将帮助您在JTable中添加一个选择复选框,当选择它时,将启用该行的特定列,并且每行的comboBox具有不同的项目值。请在回答中解释一下您的代码,因为它有点长,社区更容易理解它。此代码帮助您添加不同的当我传递Hashmap时,在每行中租用ComboBox项,如果Hashmap中的第一个col作为键,我将根据第一个值分配项。MyTableModel是TableModel,它具有单元格可编辑功能
package com.atos.table.classes;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.HashMap;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;

public class PartCustomerWindow2 {
    public static final Object[][] DATA = { { 1, 2,3, 4,false }, { 5, 6,7, 8 ,true},{ 9, 10,11, 12,true }, { 13, 14,15, 16,true } };

    public static final String[] COL_NAMES = { "One", "Two", "Three", "Four",MyTableModel1.SELECT };

    JButton but = new JButton("Add");
    private JComboBox jcomboBox = null;
    private JTextField jTextField = null;

    static Object[][] rowData = null;
    private JTable table=null;
    static   JFrame frame = null;
    HashMap mp = null;
    static int count = 0;
    String content = null;


    public JTextField getjTextField() {
        if(jTextField == null)
        {
            jTextField =  new FMORestrictedTextField(FMORestrictedTextField.JUST_ALPHANUMERIC, 8);
        }

    mp = new HashMap();
        mp.put("arif",2);
        mp.put("8",6);
        mp.put("12",10);
        mp.put("14",16);
        mp.put("pk1",22);
        mp.put("pk3",23);

             jTextField.addKeyListener(new KeyAdapter() {

             public void keyReleased(KeyEvent event) {


                 if(count == 0)
                 content = jTextField.getText();
                // System.out.println(content);

                 if(mp.containsKey(content))
                 {
                     JFrame parent = new JFrame();

                     JOptionPane.showMessageDialog(parent, "Already Assigned"); 
                 }
                 }

         });
        return jTextField;
    }


    public void setjTextField(JTextField jTextField) {
        this.jTextField = jTextField;
    }


   public JComboBox getJcomboBox() {
       if(jcomboBox == null)
       {
           jcomboBox = new JComboBox();
       }
        return jcomboBox;
    }


    public void setJcomboBox(JComboBox jcomboBox) {
        this.jcomboBox = jcomboBox;
    }


private void createAndShowGui(PartCustomerWindow2 ob)
   {
     /*rowData  = new Object[DATA.length][];
      for (int i = 0; i < rowData.length; i++) {
         rowData[i] = new Object[DATA[i].length + 1];
         for (int j = 0; j < DATA[i].length; j++) {
            rowData[i][j] = DATA[i][j];
         }
         rowData[i][DATA[i].length] = Boolean.TRUE;
         if(i == 2 || i ==3)
             rowData[i][DATA[i].length] = Boolean.FALSE;
      }*/

      MyTableModel3 tableModel = new MyTableModel3(DATA, COL_NAMES, "My Table", ob);


      table = new JTable(tableModel);

      //table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

      /*table.addFocusListener(new java.awt.event.FocusAdapter() {
          public void focusLost(java.awt.event.FocusEvent evt) {
            table.getSelectionModel().clearSelection();
          }
        });*/

      TableColumnModel cm = table.getColumnModel();


      /*cm.getColumn(2).setCellEditor(new DefaultCellEditor(

                new JComboBox(new DefaultComboBoxModel(new String[] {
                 "Yes",
                  "No",
                  "Maybe"
                }))));*/
     /* String ar1[]= {"aa","aaa","aaaa"};
      ob.getJcomboBox().setModel(new DefaultComboBoxModel(ar1));*/
      cm.getColumn(2).setCellEditor(new DefaultCellEditor(

              ob.getJcomboBox()));


      cm.getColumn(3).setCellEditor(new DefaultCellEditor(

              ob.getjTextField()));


      JScrollPane scrollPane = new JScrollPane();
     /* scrollPane.add("Table",table);
      scrollPane.add("Button",but);*/

      JFrame frame2 =  new JFrame();
     /* jcomboBox.setPreferredSize(new Dimension(100,20));
      textField.setPreferredSize(new Dimension(100,20));
      jcomboBox.setEnabled(false);
      textField.setEnabled(false);
      */
      JScrollPane scrollPane2 = new JScrollPane(but);

      but.addActionListener(new ActionListener() {


        @Override
        public void actionPerformed(ActionEvent e) {
            if(table.getCellEditor() != null)
            table.getCellEditor().stopCellEditing();
            // TODO Auto-generated method stub
            String[][] ar = new String[table.getRowCount()][5];


            for(int i =0;i<table.getRowCount();i++)
            {
                for(int j=0;j<5;j++)
                {
                    DATA[i][j] = table.getValueAt(i,j);
                }

                System.out.print(table.getValueAt(i,0)+" ");
                System.out.print(table.getValueAt(i,1)+" ");
                System.out.print(table.getValueAt(i,2)+" ");
                System.out.print(table.getValueAt(i,3)+" ");
                System.out.println(table.getValueAt(i,4)+" ");
            }

        System.out.println("*******************");
        /*
            for(int i=0;i<DATA.length;i++)
            {
                System.out.print(DATA[i][0]);
                System.out.print(DATA[i][1]);
                System.out.print(DATA[i][2]);
                System.out.print(DATA[i][3]);
                boolean check =(Boolean) DATA[i][4];
                System.out.println(check);
            }*/

    }});


      frame = new JFrame("PartCustomerWindow2");
      //
      //JFrame frame = new JFrame();
      Container contentPane = frame.getContentPane();
      contentPane.setLayout(new BorderLayout());
      contentPane.add(new JScrollPane(table), BorderLayout.NORTH);
      contentPane.add(but);


      //
      //frame.setLayout(new FlowLayout());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     /* frame.getContentPane().add(scrollPane2);
      frame.getContentPane().add(scrollPane3);
      frame.getContentPane().add(scrollPane4);*/
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);


   }





public static void main(String[] args) {
       PartCustomerWindow2 ob = new PartCustomerWindow2();

       ob.createAndShowGui(ob);

   }
}



































@SuppressWarnings("serial")
class MyTableModel3 extends DefaultTableModel {
   public static final String SELECT = "select";
   String tablename;
   PartCustomerWindow2 ob = null;



   public MyTableModel3(Object[][] rowData, Object[] columnNames, String tableName,PartCustomerWindow2 ob) {
      super(rowData, columnNames);
      this.tablename = tableName;
      this.ob = ob;

   }

   @Override
   public Class<?> getColumnClass(int columnIndex) {
      if (getColumnName(columnIndex).equalsIgnoreCase(SELECT)) {

         return Boolean.class;
      }
      else

      return super.getColumnClass(columnIndex);
   }

   @Override
   public boolean isCellEditable(int row, int col) {
       JComboBox jb = ob.getJcomboBox();
       JTextField jt = ob.getjTextField();

       if(((Boolean) getValueAt(row, getColumnCount() - 1)).booleanValue())
       {

         //  jb.setEnabled(false);

          jb.removeAllItems();
          // System.out.println(jb.getItemCount());
          if(row == 0)
          {
             jb.addItem("arif");
              jb.addItem("asif");
               jb.addItem("ashik");
               jb.addItem("farooq");
               jb.addItem("adkh");

          }

          if(row > 0)
          {
             jb.addItem("kjhds");
               jb.addItem("sdds");
               jb.addItem("asdfsdk");
               jb.addItem("sdfsdf");
               jb.addItem("sdf");
          }

        /*HashMap mp = new HashMap();
        mp.put("arif",2);
        mp.put("8",6);
        mp.put("12",10);
        mp.put("14",16);
        mp.put("pk1",22);
        mp.put("pk3",23);
          */
        /* if(col == 3){

        if(mp.containsKey(jt.getText()))
          {
            System.out.println("Sorry..!! already assigned");
            jt.setFocusable(true);
          }

           jt.setText("");
           jt.setEnabled(false);
       }*/
       }
       else
       {
          // jb.setEnabled(true);
           //jt.setEnabled(true);
       }

       if (col == getColumnCount()-1 ) {

         return true;
       }
      else{
          if (getColumnName(4).equalsIgnoreCase(SELECT) && ((Boolean) getValueAt(row, getColumnCount() - 1)).booleanValue())
          {  
            //  jb.setEnabled(true);


             // jt.setEnabled(true);
              return (col == 2 || col == 3);

          }
          else{
             // jb.setEnabled(false);
              //jt.setEnabled(false);
              return false;
          }


      }

   }





}