本着碰到一个问题就解决一个的精神 我又来提问了
jtable 表格单元格 加入了 面板jplane
面板里面有 jtextfield 和 Button 用tab 换焦点到单元格 但是无法直接录入数据(和加入控件之前相比)
必须用鼠标双击 才能进入编辑(我想肯定是焦点控制问题)
我先后给JPanel 添加了 键盘事件监听
焦点事件监听
目的 让 jtextfield 得到焦点 就可以直接录入数据了 但是没有实现 特向大家请教
package newpackage;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 TT { public static void main(String[] args) {
JTable table = new JTable(2, 5);
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);
panel.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent evt) {
if (evt.getSource() == panel) {
tf.requestFocus();
} }
});
btn.setMargin(new Insets(0, 0, 0, 0));
btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
JFrame jf=new JFrame("知识就是力量") ;
jf.setSize(333,444);
jf.setVisible(true); }
});
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()); panel.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { if (evt.getSource() == panel) {
tf.requestFocus(); } }
});
return panel;
}
}
jtable 表格单元格 加入了 面板jplane
面板里面有 jtextfield 和 Button 用tab 换焦点到单元格 但是无法直接录入数据(和加入控件之前相比)
必须用鼠标双击 才能进入编辑(我想肯定是焦点控制问题)
我先后给JPanel 添加了 键盘事件监听
焦点事件监听
目的 让 jtextfield 得到焦点 就可以直接录入数据了 但是没有实现 特向大家请教
package newpackage;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 TT { public static void main(String[] args) {
JTable table = new JTable(2, 5);
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);
panel.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent evt) {
if (evt.getSource() == panel) {
tf.requestFocus();
} }
});
btn.setMargin(new Insets(0, 0, 0, 0));
btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
JFrame jf=new JFrame("知识就是力量") ;
jf.setSize(333,444);
jf.setVisible(true); }
});
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()); panel.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { if (evt.getSource() == panel) {
tf.requestFocus(); } }
});
return panel;
}
}
在按钮上还要实现功能
可以在 tf.requestFocus(); 后面打印下,看看究竟有没有被调用到
getTableCellEditorComponent这个方法只是负责得到一个component并且根据这个对象去绘制。不会顾及什么焦点问题。我单独封装了一个表格控件。你可以看一下。你距离真相近在咫尺啊~~
三个类。在你前面的基础上更改的,但是做了一次封装。名字没有改,所以可能类名已经不是很合适了。
请查看package focusnext;import java.awt.BorderLayout;
import java.awt.Container;
import java.util.Vector;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;public class FocusNextEditableTableFrame extends JFrame {
private static final long serialVersionUID = 1L;
FocusNextEditableTable t;
private String colNames[] = new String[] { "能编辑1", "Title 2", "能编辑3",
"标题 4", "标题 5", "标题 6", "标题 15", "标题 18", "能编辑" };
private Vector<Vector<String>> data = new Vector<Vector<String>>();
private boolean[] canEdit = new boolean[] { true, false, true, false,
false, true, false, false, true }; public FocusNextEditableTableFrame() {
super();
initTestData();
Container c = getContentPane();
c.setLayout(new BorderLayout()); t = new FocusNextEditableTable();
t.setModel(new DefaultTableModel() {
private static final long serialVersionUID = 1L; @Override
public int getRowCount() {
return data.size();
} @Override
public int getColumnCount() {
return colNames.length;
} @Override
public Object getValueAt(int row, int column) {
Object value = data.get(row).get(column);
return value == null ? "" : value.toString();
} @Override
public String getColumnName(int column) {
return colNames[column];
} @Override
public void setValueAt(Object value, int row, int column) {
data.get(row)
.set(column, value == null ? "" : value.toString());
} @Override
public boolean isCellEditable(int row, int column) {
return canEdit[column];
}
}); c.add(new JScrollPane(t));
t.getColumnModel().getColumn(0).setCellEditor(new FilePathCellEditor()); setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600, 400);
setLocationRelativeTo(null);
setVisible(true);
} private void initTestData() {
for (int i = 0; i < 20; i++) {
Vector<String> v = new Vector<String>();
for (int j = 0; j < 9; j++) {
v.add("");
}
data.add(v);
}
} public static void main(String[] args) {
new FocusNextEditableTableFrame();
}
}package focusnext;import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;import javax.swing.AbstractAction;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;public class FocusNextEditableTable extends JTable { private static final long serialVersionUID = 1L; private KeyListener listener = new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
if (e.getSource() != FocusNextEditableTable.this) {
e.setSource(FocusNextEditableTable.this);
FocusNextEditableTable.this.dispatchEvent(e);
}
}
}; }; AbstractAction moveForward = new AbstractAction() {
private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) {
int row = getSelectedRow();
int col = getSelectedColumn();
row = row < 0 ? 0 : row; int nextFocusRow = row;
int nextFocusCol = col; do {
nextFocusCol++;
if (nextFocusCol >= getColumnCount()) {
nextFocusCol = 0;
nextFocusRow++;
nextFocusRow = nextFocusRow >= getRowCount() ? 0
: nextFocusRow;
}
} while (!isCellEditable(nextFocusRow, nextFocusCol));
changeSelection(nextFocusRow, nextFocusCol, false, false);
editCellAt(nextFocusRow, nextFocusCol);
};
}; public FocusNextEditableTable() {
super();
setRowSelectionAllowed(false);
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
addKeyListener(listener); getActionMap()
.remove(
getInputMap().get(
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)));
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
"moveForward");
getActionMap().put("moveForward", moveForward);
} @Override
public boolean editCellAt(int row, int column) {
boolean editCellAt = super.editCellAt(row, column);
Component comp = getEditorComponent();
if (comp != null) {
comp.addKeyListener(listener);
comp.requestFocus();
if (comp instanceof JTextField) {
((JTextField) comp).selectAll();
}
}
return editCellAt;
}}
package focusnext;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.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;public class FilePathCellEditor extends DefaultCellEditor { private static final long serialVersionUID = 1L;
private JTextField tf = new JTextField();
private JButton btn = new JButton("...");
private JPanel panel = new JPanel() {
private static final long serialVersionUID = 1L; @Override
public void requestFocus() {
super.requestFocus();
tf.requestFocus();
tf.selectAll();
}
}; private KeyListener l = null; public FilePathCellEditor() {
super(new JTextField()); btn.setMargin(new Insets(0, 0, 0, 0));
panel.setLayout(new BorderLayout());
panel.add(tf);
panel.add(btn, BorderLayout.EAST);
panel.setOpaque(true);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int rs = Integer.MIN_VALUE;
while (rs != JOptionPane.YES_OPTION) {
rs = JOptionPane.showConfirmDialog(panel.getParent(), "你服不服?","",JOptionPane.YES_NO_OPTION
);
}
}
});
} @Override
public Component getTableCellEditorComponent(final JTable table,
Object value, boolean isSelected, int row, int column) {
tf.setText(value == null ? "" : value.toString());
l = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
e.setSource(table);
table.dispatchEvent(e);
}
}
};
tf.addKeyListener(l);
btn.addKeyListener(l);
return panel;
} @Override
public boolean stopCellEditing() {
if (l != null) {
btn.removeKeyListener(l);
tf.removeKeyListener(l);
}
return super.stopCellEditing();
} @Override
public Object getCellEditorValue() {
return tf.getText().trim();
}
}
不知道老弟现在在忙啥项目哦,能讲来听听吗?? 人多思路多,,,