给JTabel的单元格的CellEcitor指定为一个即可输入又可 有个按钮能够弹出文件选择框我做了一个自定义组件 一个JTextField的右边放一个JButton,用于JTable的CellEditor,但这不行,因为当把它放在单元格中时,这个自定义组件不能融入单元格,结果是单元格中间是这个组件,周边竟是空白,我琢磨了一下,它们到底是两个组件,单元格不能把自己和自定义组件融合,唉,那怎么办呢?一些变通的想法:
我这边不能再为JTable在加一列了,改动太大。
或者继承JComboBox,恩,我在想这个行不行,正在尝试中,大家有什么好经验,好思路?

解决方案 »

  1.   

    没什么可讨论的,renderer没写好
      

  2.   

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.io.File;
    import java.util.EventObject;import javax.swing.*;
    import javax.swing.table.TableCellEditor;public class T {
        public static void main(String[] args) {
         JTable table = new JTable(5, 2);
         table.setDefaultEditor(Object.class, new FilePathCellEditor());
         JScrollPane sp = new JScrollPane(table);
        
         JFrame f = new JFrame("TableCellEditorTest");
    f.getContentPane().add(sp, BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
        }
    }class FilePathCellEditor extends AbstractCellEditor implements TableCellEditor{
    JPanel panel = new JPanel(new BorderLayout());
    JTextField tf = new JTextField();
    JButton btn = new JButton("...");
    JFileChooser fileChooser = null;

    public FilePathCellEditor() {
    panel.add(tf, BorderLayout.CENTER);
    panel.add(btn, BorderLayout.EAST);

    btn.setMargin(new Insets(0, 0, 0, 0));
    btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if (fileChooser == null) {
    fileChooser = new JFileChooser();
    }
    int r = fileChooser.showOpenDialog(panel);
    if (r == JFileChooser.APPROVE_OPTION) {
    File file = fileChooser.getSelectedFile();
    tf.setText(file.getPath());
    }
    }
    });
    tf.setBorder(null);
    }    public boolean isCellEditable(EventObject anEvent) {
        if (anEvent instanceof MouseEvent) { 
         return ((MouseEvent)anEvent).getClickCount() >= 2;
        }
        return true;
    }

    public Object getCellEditorValue() {
    return tf.getText();
    } public Component getTableCellEditorComponent(
    JTable table, Object value, boolean isSelected, int row, int column) {

    tf.setText(value == null ? "" : value.toString());

    return panel;
    }
    }