Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java GUI 设计 » Swing  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 你想改善JTable的默认编辑行为吗
liuzhenke15





发贴: 45
积分: 0
于 2006-03-31 08:30 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
JTable默认时,当你双击一个CELL,可以进入正常的编辑状态,但如果单击选择,或者用键盘移动光标选择,则录入的东西只会添加到当前CELL内容的后边。(如果您是用键盘选择,经常出现JTable不接收你的输入的现象)。
或许你是一个熟悉了VB/VC/BC/DELPHI的程序员,发现这种默认编辑行为很不能接受,而且经常需要鼠标加键盘的操作,特别对于一个单据录人人员来说,不断切换键盘和鼠标是非常痛苦的。
本文希望能够为您解答以上问题,共勉!
(注:本文程序在Java1.4版本可以正常运行,其它版本没有验证)
首先你需要创建一个继承KeyAdapter的类:CTableKeyAdapter。源代码如下:

package Concept.Customize.awt.event;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CTableKeyAdapter extends KeyAdapter {
JTable table;
public CTableKeyAdapter(JTable pTable) {
table=pTable;
}
public void keyTyped(KeyEvent e) {
int row;
int column;
row=table.getSelectedRow();
column=table.getSelectedColumn();
boolean bFirstTimeEdit;
bFirstTimeEdit=false;
Component editorComp;
editorComp = table.getEditorComponent();
if (editorComp==null) {
bFirstTimeEdit=true;
} else {
if (editorComp instanceof JTextField) {
if (((JTextField)editorComp).getText()==null) {
if (table.getValueAt(row,column)==null) {
bFirstTimeEdit=true;
}
} else {
if (((JTextField)editorComp).getText().equals(table.getValueAt(row,column))) {
bFirstTimeEdit=true;
}
}
}
}

if (editorComp==null) {
table.editCellAt(table.getSelectedRow(),table.getSelectedColumn());
}
editorComp = table.getEditorComponent();

if (editorComp != null) {
if (bFirstTimeEdit) {
if (editorComp instanceof JTextField) {
if (e.getKeyChar()!=KeyEvent.VK_ENTER) {
((JTextField)editorComp).setText(null);
}
}
}
editorComp.requestFocus();
}
}
}

然后在你创建JTable的地方添加以下代码即可:

table=new JTable();
table.addKeyListener(new CTableKeyAdapter(table));
TableCellEditor tableCellEditor=table.getDefaultEditor(String.class);
if (tableCellEditor!=null) {
if (tableCellEditor instanceof DefaultCellEditor) {
((DefaultCellEditor)tableCellEditor).setClickCountToStart(1);
}
}

您的程序改善了吗!



作者 Re:你想改善JTable的默认编辑行为吗 [Re:liuzhenke15]
princemaozh





发贴: 7
积分: 0
于 2006-03-31 15:04 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
liuzhenke15, 你的JTable行为友好多了。有点象EXCEL表格的行为。

我尝试用了你的方法。单击cell的时候,仍能进入编辑。代码如下:
String[][] BookInfo =
{
{"JAVA","james","one"},
{"SQL","jacky","two"}
};
String [] ColumnName = {"Col1","Col2","Col3"};
  
DefaultTableModel dm = new DefaultTableModel();
dm.setDataVector(BookInfo,ColumnName);
  
JTable table = new JTable( dm );
table.addKeyListener(new CTableKeyAdapter(table));
TableCellEditor tableCellEditor=table.getDefaultEditor(String.class);
if (tableCellEditor!=null) {
if (tableCellEditor instanceof DefaultCellEditor) {
  ((DefaultCellEditor)tableCellEditor).setClickCountToStart(2);
}
}

而我期望单击时禁止编辑,双击时才允许编辑。如何实现呢?



作者 Re:你想改善JTable的默认编辑行为吗 [Re:princemaozh]
liuzhenke15





发贴: 45
积分: 0
于 2006-03-31 16:09 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
如果你希望双击后才允许编辑,或许需要结合鼠标监听器与isCellEditable()


作者 Re:你想改善JTable的默认编辑行为吗 [Re:liuzhenke15]
liuzhenke15





发贴: 45
积分: 0
于 2006-03-31 16:11 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
或许还要通过监听鼠标双击修改DefaultEditor返回的JTextField的属性


作者 Re:你想改善JTable的默认编辑行为吗 [Re:liuzhenke15]
princemaozh





发贴: 7
积分: 0
于 2006-04-01 23:14 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
试过了,没有实现。

以下两点几乎是难以兼得的:
(1)单击时禁止编辑(不响应键盘输入)
(2)双击时允许编辑并进入活跃状态(此时可以随意移动插入光标)

因为(2)的双击其实分两步走,第二击的时候会检查cell是否editable, 只有已经是true的情况下,才会进入“可编辑并活跃状态”。
而一旦在第二击前是editable, 说明(1) 是不满足的,即可相应键盘输入。

我想对控件特性熟一些的高手是可以解决这个问题。 我还是没整出来。。。



作者 Re:你想改善JTable的默认编辑行为吗 [Re:liuzhenke15]
liuzhenke15





发贴: 45
积分: 0
于 2006-04-03 08:08 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我的意思是不要在JTable本身找答案,而是尝试在cell的编辑控件上找答案。可以自己定义该编辑控件,然后注册到JTable中。对于JTable来说,该cell是可以编辑的,但当需要编辑时,由编辑控件去控制是否允许接受输入。该控件可以定义一个是否可编辑的属性,当双击时有效,而当光标离开时无效。
以上仅是建议,希望有帮助



作者 Re:你想改善JTable的默认编辑行为吗 [Re:liuzhenke15]
princemaozh





发贴: 7
积分: 0
于 2006-04-03 08:48 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
谢谢。可以了。


作者 Re:你想改善JTable的默认编辑行为吗 [Re:liuzhenke15]
liuzhenke15





发贴: 45
积分: 0
于 2006-05-16 21:06 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Java基本模型非常优秀,如果拓展TableModel可以设计出象Excel一样的工具


作者 Re:你想改善JTable的默认编辑行为吗 [Re:liuzhenke15]
liuzhenke15





发贴: 45
积分: 0
于 2006-07-30 15:05 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
关于JTable,希望能够与大家分享



flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923