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