jpsel = new JPanel(); jpsel.setLayout(null); jpsel.setBackground(new Color(240,240,240)); c = Calendar.getInstance(); String[] s = {"姓名","类别","工作天数","日值","金额","津贴","加班费","产量工资","应发","应扣","实发"}; dtm = new DefaultTableModel(s, 100); jt = new JTable(dtm); jt.setRowHeight(30); cm = jt.getColumnModel(); setFocusMoveHorizontal(jt);
String[] type = {"班长","A","B"}; jcbtype = new JComboBox(type); jcbtype.setBorder(BorderFactory.createEtchedBorder()); ce = new DefaultCellEditor(jcbtype); cm.getColumn(1).setCellEditor(ce);
如果改成0的话,我这儿就一直报错了【Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location】if(col == 1){ jcbtype.setPopupVisible(true); }这段代码:我的本意是当选择的列是第二列(也就是“类别”)的时候,JCombobox中的Item自动展开我想要的效果就是:当用回车或者光标键移动到“类别”这一列时,JCombobox自动展开,然后再直接用光标键移动到JCombobox中的其中某一项,然后按回车选中(比如选中“班长”),同时光标跳入右边的单元格(“工作天数”),且“工作天数”这个单元格进入编辑状态。
// TODO 自动生成方法存根
//再次加入处理函数 比如设置某个table项的内容 }
});
public class TableTest { /**
* @param args
*/
private JComboBox jcbc,jcby,jcbm,jcbtype;
private JButton jbsel,jbprint;
private JLabel jlss,jlcxt,jly,jlm;
private JTable jt;
private DefaultTableModel dtm;
private JScrollPane jsp;
private JPanel jpsel,jp;
private DefaultCellEditor ce,cjtf;
private TableColumnModel cm;
private JFrame jf;
private JTextField jtf;
TableTest(){
jpsel = new JPanel();
jpsel.setLayout(null);
jpsel.setBackground(new Color(240,240,240));
c = Calendar.getInstance();
String[] s = {"姓名","类别","工作天数","日值","金额","津贴","加班费","产量工资","应发","应扣","实发"};
dtm = new DefaultTableModel(s, 100);
jt = new JTable(dtm);
jt.setRowHeight(30);
cm = jt.getColumnModel();
setFocusMoveHorizontal(jt);
String[] type = {"班长","A","B"};
jcbtype = new JComboBox(type);
jcbtype.setBorder(BorderFactory.createEtchedBorder());
ce = new DefaultCellEditor(jcbtype);
cm.getColumn(1).setCellEditor(ce);
jt.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_ENTER ||
e.getKeyCode() == KeyEvent.VK_UP ||
e.getKeyCode() == KeyEvent.VK_DOWN ||
e.getKeyCode() == KeyEvent.VK_LEFT ||
e.getKeyCode() == KeyEvent.VK_RIGHT ){
JTable t = (JTable)e.getSource();
int row,col;
row = t.getSelectedRow();
col = t.getSelectedColumn();
t.editCellAt(row,col);
if(col == 1){
jcbtype.setPopupVisible(true);
}else{
JTextField editor = ((JTextField)t.getCellEditor().getTableCellEditorComponent(t,t.getValueAt(row,col),true,row,col));
editor.selectAll();
}
}
}
});
jsp = new JScrollPane(jt);
jsp.setBorder(BorderFactory.createEtchedBorder());
jsp.setBounds(5, 5, 980, 400); jpsel.add(jsp);
jf = new JFrame();
jf.setSize(1000, 600);
jf.add(jpsel);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public int[] p(JTable jt){
int[] i = {jt.getSelectedRow(),jt.getSelectedColumn()};
return i;
}
public static void setFocusMoveHorizontal(JTable table) {
table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).
put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "selectNextColumnCell"); }
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
JFrame.setDefaultLookAndFeelDecorated(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new TableTest();
}}
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER
|| e.getKeyCode() == KeyEvent.VK_UP
|| e.getKeyCode() == KeyEvent.VK_DOWN
|| e.getKeyCode() == KeyEvent.VK_LEFT
|| e.getKeyCode() == KeyEvent.VK_RIGHT) {
JTable t = (JTable) e.getSource();
int row, col;
row = t.getSelectedRow();
col = t.getSelectedColumn();
t.editCellAt(row, col);
if (col == 0) { //这里改成0 就没有楼主说的情况了
jcbtype.setPopupVisible(true); } else {
JTextField editor = ((JTextField) t.getCellEditor()
.getTableCellEditorComponent(t,
t.getValueAt(row, col), true, row, col));
editor.selectAll();
} }
}
});
jcbtype.setPopupVisible(true);
}这段代码:我的本意是当选择的列是第二列(也就是“类别”)的时候,JCombobox中的Item自动展开我想要的效果就是:当用回车或者光标键移动到“类别”这一列时,JCombobox自动展开,然后再直接用光标键移动到JCombobox中的其中某一项,然后按回车选中(比如选中“班长”),同时光标跳入右边的单元格(“工作天数”),且“工作天数”这个单元格进入编辑状态。