如何在Table的单元格中嵌入下拉框?
比如有三午四列的表格,想在第二行,第三列嵌入一个下拉框,鼠标点击时可以选择.
时间研究,只好来这里速求代码了.

解决方案 »

  1.   

    /* 
     * ColorRenderer.java (compiles with releases 1.2, 1.3, and 1.4) is used by 
     * TableDialogEditDemo.java.
     */import javax.swing.BorderFactory;
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.border.Border;
    import javax.swing.table.TableCellRenderer;
    import java.awt.Color;
    import java.awt.Component;public class ColorRenderer extends JLabel
                               implements TableCellRenderer {
        Border unselectedBorder = null;
        Border selectedBorder = null;
        boolean isBordered = true;    public ColorRenderer(boolean isBordered) {
            this.isBordered = isBordered;
            setOpaque(true); //MUST do this for background to show up.
        }    public Component getTableCellRendererComponent(
                                JTable table, Object color,
                                boolean isSelected, boolean hasFocus,
                                int row, int column) {
            Color newColor = (Color)color;
            setBackground(newColor);
            if (isBordered) {
                if (isSelected) {
                    if (selectedBorder == null) {
                        selectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
                                                  table.getSelectionBackground());
                    }
                    setBorder(selectedBorder);
                } else {
                    if (unselectedBorder == null) {
                        unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
                                                  table.getBackground());
                    }
                    setBorder(unselectedBorder);
                }
            }
            
            setToolTipText("RGB value: " + newColor.getRed() + ", "
                                         + newColor.getGreen() + ", "
                                         + newColor.getBlue());
            return this;
        }
    }//这个是一个绘制的类
      

  2.   

    /* 
     * ColorEditor.java (compiles with releases 1.3 and 1.4) is used by 
     * TableDialogEditDemo.java.
     */import javax.swing.AbstractCellEditor;
    import javax.swing.table.TableCellEditor;
    import javax.swing.JButton;
    import javax.swing.JColorChooser;
    import javax.swing.JDialog;
    import javax.swing.JTable;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;public class ColorEditor extends AbstractCellEditor
                             implements TableCellEditor,
                ActionListener {
        Color currentColor;
        JButton button;
        JColorChooser colorChooser;
        JDialog dialog;
        protected static final String EDIT = "edit";    public ColorEditor() {
            //Set up the editor (from the table's point of view),
            //which is a button.
            //This button brings up the color chooser dialog,
            //which is the editor from the user's point of view.
            button = new JButton();
            button.setActionCommand(EDIT);
            button.addActionListener(this);
            button.setBorderPainted(false);        //Set up the dialog that the button brings up.
            colorChooser = new JColorChooser();
            dialog = JColorChooser.createDialog(button,
                                            "Pick a Color",
                                            true,  //modal
                                            colorChooser,
                                            this,  //OK button handler
                                            null); //no CANCEL button handler
        }    /**
         * Handles events from the editor button and from
         * the dialog's OK button.
         */
        public void actionPerformed(ActionEvent e) {
            if (EDIT.equals(e.getActionCommand())) {
                //The user has clicked the cell, so
                //bring up the dialog.
                button.setBackground(currentColor);
                colorChooser.setColor(currentColor);
                dialog.setVisible(true);            //Make the renderer reappear.
                fireEditingStopped();        } else { //User pressed dialog's "OK" button.
                currentColor = colorChooser.getColor();
            }
        }    //Implement the one CellEditor method that AbstractCellEditor doesn't.
        public Object getCellEditorValue() {
            return currentColor;
        }    //Implement the one method defined by TableCellEditor.
        public Component getTableCellEditorComponent(JTable table,
                                                     Object value,
                                                     boolean isSelected,
                                                     int row,
                                                     int column) {
            currentColor = (Color)value;
            return button;
        }
    }//这是一个实现了编辑JTable的类
      

  3.   

    /*
     * TableDialogEditDemo.java is a 1.4 application that requires these files:
     *   ColorRenderer.java
     *   ColorEditor.java
     */import javax.swing.JComponent;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;/**
     * This is like TableDemo, except that it substitutes a
     * Favorite Color column for the Last Name column and specifies
     * a custom cell renderer and editor for the color data.
     */
    public class TableDialogEditDemo extends JPanel {
        private boolean DEBUG = false;    public TableDialogEditDemo() {
            super(new GridLayout(1,0));        JTable table = new JTable(new MyTableModel());
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));        //Create the scroll pane and add the table to it.
            JScrollPane scrollPane = new JScrollPane(table);        //Set up renderer and editor for the Favorite Color column.
            table.setDefaultRenderer(Color.class,
                                     new ColorRenderer(true));
            table.setDefaultEditor(Color.class,
                                   new ColorEditor());        //Add the scroll pane to this panel.
            add(scrollPane);
        }    class MyTableModel extends AbstractTableModel {
            private String[] columnNames = {"First Name",
                                            "Favorite Color",
                                            "Sport",
                                            "# of Years",
                                            "Vegetarian"};
            private Object[][] data = {
                {"Mary", new Color(153, 0, 153),
                 "Snowboarding", new Integer(5), new Boolean(false)},
                {"Alison", new Color(51, 51, 153),
                 "Rowing", new Integer(3), new Boolean(true)},
                {"Kathy", new Color(51, 102, 51),
                 "Knitting", new Integer(2), new Boolean(false)},
                {"Sharon", Color.red,
                 "Speed reading", new Integer(20), new Boolean(true)},
                {"Philip", Color.pink,
                 "Pool", new Integer(10), new Boolean(false)}
            };        public int getColumnCount() {
                return columnNames.length;
            }        public int getRowCount() {
                return data.length;
            }        public String getColumnName(int col) {
                return columnNames[col];
            }        public Object getValueAt(int row, int col) {
                return data[row][col];
            }        /*
             * JTable uses this method to determine the default renderer/
             * editor for each cell.  If we didn't implement this method,
             * then the last column would contain text ("true"/"false"),
             * rather than a check box.
             */
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }        public boolean isCellEditable(int row, int col) {
                //Note that the data/cell address is constant,
                //no matter where the cell appears onscreen.
                if (col < 1) {
                    return false;
                } else {
                    return true;
                }
            }        public void setValueAt(Object value, int row, int col) {
                if (DEBUG) {
                    System.out.println("Setting value at " + row + "," + col
                                       + " to " + value
                                       + " (an instance of "
                                       + value.getClass() + ")");
                }            data[row][col] = value;
                fireTableCellUpdated(row, col);            if (DEBUG) {
                    System.out.println("New value of data:");
                    printDebugData();
                }
            }        private void printDebugData() {
                int numRows = getRowCount();
                int numCols = getColumnCount();            for (int i=0; i < numRows; i++) {
                    System.out.print("    row " + i + ":");
                    for (int j=0; j < numCols; j++) {
                        System.out.print("  " + data[i][j]);
                    }
                    System.out.println();
                }
                System.out.println("--------------------------");
            }
        }    /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Make sure we have nice window decorations.
            JFrame.setDefaultLookAndFeelDecorated(true);        //Create and set up the window.
            JFrame frame = new JFrame("TableDialogEditDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        //Create and set up the content pane.
            JComponent newContentPane = new TableDialogEditDemo();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);        //Display the window.
            frame.pack();
            frame.setVisible(true);
        }    public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }//这个是主类,用上面两个类来绘制和编辑,这是从sun 公司的例子:http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/index.html