JTable中某列加入JCombobox,当移动到jcombobox后,用上下键选择jcombobox中的内容,但是却跳入jtable的下一行,求解决方法.如图

MisterNil 2010-03-06 12:27:16
JTable中某列加入JCombobox,当移动到jcombobox后,用上下键选择jcombobox中内容的时候,却跳入jtable的下一行了,求解决方法
目前已经实现:用回车键替换掉了Tab键,按回车或者光标上下左右键就可以按顺序选择单元格,且同时进入当前选择单元格的编辑状态
想实现的是:当移动到jcombobox后,用上下键选择内容后,回车键,然后跳到紧挨着的“工作天数”单元格

如图所示

按下 “下键”却蹦到下一行了


我的想法是:当移动到这一列时,暂时将JTable默认的按键事件移除,只执行JCombobox,然后跳到下一单元格时再恢复按键事件……呵呵,无奈自己写不出来相关代码……愁了好几天了,查阅jdk以及浏览很多网页未果
...全文
297 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
MisterNil 2010-03-08
  • 打赏
  • 举报
回复
顶下……

谢谢
MisterNil 2010-03-07
  • 打赏
  • 举报
回复
愁死我了

大家帮我看看呀,谢谢
MisterNil 2010-03-06
  • 打赏
  • 举报
回复
如果改成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中的其中某一项,然后按回车选中(比如选中“班长”),同时光标跳入右边的单元格(“工作天数”),且“工作天数”这个单元格进入编辑状态。
musiclee 2010-03-06
  • 打赏
  • 举报
回复
其实还是有点看不懂你的意思 你到底想要什么效果?
musiclee 2010-03-06
  • 打赏
  • 举报
回复
我把你代码试了下

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 == 0) { //这里改成0 就没有楼主说的情况了
jcbtype.setPopupVisible(true);

} else {
JTextField editor = ((JTextField) t.getCellEditor()
.getTableCellEditorComponent(t,
t.getValueAt(row, col), true, row, col));
editor.selectAll();
}

}
}
});
MisterNil 2010-03-06
  • 打赏
  • 举报
回复
我不会像1楼那样发代码……

找不到该怎样把代码发成那样子
MisterNil 2010-03-06
  • 打赏
  • 举报
回复
我把代码发上来,朋友帮我看看,谢谢


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();
}

}
MisterNil 2010-03-06
  • 打赏
  • 举报
回复
谢谢,我先去试试……

总感觉还是有点迷糊
musiclee 2010-03-06
  • 打赏
  • 举报
回复
直接给JCombobox的元素加消息 直接设置对应行的'类别'设置 ,

comboBox.addItemListener(new ItemListener(){

public void itemStateChanged(ItemEvent arg0) {
// TODO 自动生成方法存根
//再次加入处理函数 比如设置某个table项的内容

}

});

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧