今天这篇文章主要实现双击修改的功能,话说这java的winform程序实在是令人崩溃,各种问题搞得我神志不清。
那么这个功能就是双击Jtable中的某一行,然后弹出修改界面,修改完之后数据刷新到Jtable中。同时,这个修改界面还支持页码变化,即可以点击上一页,下一页等按钮抓取Jtable中对应行的数据。
先看双击事件,在C#中DataGridView有双击事件,可是JTable没有。怎么办呢?大家不知道看没看过我的另一篇文章,Silverlight MVVM切近实战主界面的双击实现,今天java这个双击和那个类似,原理就是监控两次单击在指定的时间段内完成的话算双击。
TimerTask timTsk;
Timer tim = new Timer();
Boolean isTimerRuning = true;
String ename=\"\";
private void TimTaskInit() {
timTsk = new TimerTask() {
public void run() {
isTimerRuning = false;
}
};
tim.schedule(timTsk, 200, 200);
}
private void ShowModifyForm() throws IllegalArgumentException,
IllegalAccessException {
if (isTimerRuning) {
isTimerRuning = false;
FrmCodeModify frmCodeModify = new FrmCodeModify(table,this);
frmCodeModify.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
StartMain.SetMidScreen(frmCodeModify);
frmCodeModify.setVisible(true);
} else {
TimerScheduleReset(timTsk);
isTimerRuning = true;
tim.schedule(timTsk, 200, 200);
}
}
private void TimerScheduleReset(TimerTask timTsk) {
Field field;
try {
field = TimerTask.class.getDeclaredField(\"state\");
field.setAccessible(true);
try {
field.set(timTsk, 0);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在Jtable单击的时候调用ShowModifyForm()
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
if (table.getSelectedRow() == -1) {
MessageHelper.ShowMessage(\"请双击要修改的行!\");
return;
}
ShowModifyForm();
} catch (IllegalArgumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
在调用弹出界的时候,首先定义一个timer,它的任务是200ms执行一次。每一次时间间隔之后都会将变量isTimerRuning设置为false。当单击第一次的时候,将其设置为true,当单击第二次的时候判断如果还是true,说明这两次单击是在200ms内完成的,从而模拟了双击事件。
OK,模拟玩双击事件之后,就是打开修改界面了。在这里我直接把Jtable和主窗口都传过去了。其实可以只传个主窗口就可以的,至于为什么要传,一会说。
FrmCodeModify frmCodeModify = new FrmCodeModify(table,this);
好了,界面打开之后,如下
我们发现比上篇文章多出了备注这个字段,所以加了个字段
String sql = "SELECT 0 as bit,data,ename,cname,display_content,remark FROM dbo.Codes WHERE ename='"
但是这个列并不用来显示在jtable中,所以隐藏它
CommonFunctions.hiddenColumn(5, table);
public class CommonFunctions {
public static void hiddenColumn(int columnIndex,JTable table){
TableColumnModel tcm=table.getColumnModel();
TableColumn tc=tcm.getColumn(columnIndex);
tc.setWidth(0);
tc.setPreferredWidth(0);
tc.setMaxWidth(0);
tc.setMinWidth(0);
table.getTableHeader().getColumnModel().getColumn(columnIndex)
.setMaxWidth(0);
table.getTableHeader().getColumnModel().getColumn(columnIndex)
.setMinWidth(0);
}
}
OK,我们可以通过上面的翻页来加载主页面jtable中的数据。看一下代码,首先是初始化
public FrmCodeModify(JTable tb,JFrame jf) {
InitForm();
table = tb;
this.jf=jf;
Init();
}
/**
* Create the frame.
*/
public FrmCodeModify() {
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
((FrmSysCodeMng)jf).BindTable();
}
});
InitForm();
}
初始化的时候将传过来的jtable和jf附上值。然后调用Init()。再说这个Init之前,我想说的是,java 中为什么没有提供有参构造函数调用无参构造函数的方案。在C#中是通过有参:this()来实现的。好了,我们看一下Init
private void Init() {
rowIndex = table.getSelectedRow();
this.RowIndexChanged(rowIndex);
this.RefreshPagerState();
RegisterEventListener();
}
private void RefreshPagerState() {
labFirst.setEnabled(true);
labPrevious.setEnabled(true);
labNext.setEnabled(true);
labLast.setEnabled(true);
if (rowIndex == 0) {
labFirst.setEnabled(false);
labPrevious.setEnabled(false);
}
if (rowIndex == table.getRowCount() - 1) {
labNext.setEnabled(false);
labLast.setEnabled(false);
}
}
private void RowIndexChanged(int rowIndex) {
String data = table.getValueAt(rowIndex, 1).toString();
String ename = table.getValueAt(rowIndex, 2).toString();
String cname = table.getValueAt(rowIndex, 3).toString();
String display = table.getValueAt(rowIndex, 4).toString();
String remark = table.getValueAt(rowIndex, 5).toString();
this.txtDisplay.setText(display);
this.labCName.setText(cname);
this.labEname.setText(ename);
this.labData.setText(data);
this.txtRemark.setText(remark);
}
private void GetRowIndex(PagerType pt) {
switch (pt) {
case FIRST:
rowIndex = 0;
break;
case PREVIOUS:
rowIndex--;
break;
case NEXT:
rowIndex++;
break;
case LAST:
rowIndex = table.getRowCount() - 1;
break;
}
}
private void RegisterEventListener() {
JLabel[] labels = new JLabel[] { labFirst, labPrevious, labNext,
labLast };
for (JLabel lb : labels) {
lb.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
PagerType pt;
String labName = ((JLabel)e.getComponent()).getName();
MessageHelper.ShowMessage(labName);
switch (labName) {
case "labFirst":
pt = PagerType.FIRST;
break;
case "labPrevious":
pt = PagerType.PREVIOUS;
break;
case "labNext":
pt = PagerType.NEXT;
break;
case "labLast":
pt = PagerType.LAST;
break;
default:
pt = PagerType.FIRST;
break;
}
GetRowIndex(pt);
RowIndexChanged(rowIndex);
RefreshPagerState();
}
});
}
}
enum PagerType {
FIRST, PREVIOUS, NEXT, LAST
}
这一堆的代码就是用来实现初始化数据的,先获取父页面jtable双击的行的行号。将值取出来放在修改界面上。然后刷新分页按钮状态,并给分页按钮注册统一事件处理程序。实现分页显示。最后修改数据,保存
private void UpdateCodeInformation() {
String display = txtDisplay.getText().trim();
String remark = txtRemark.getText().trim();
String ename = labEname.getText();
String data = labData.getText();
String sql = "Update TOP(1) dbo.Codes SET display_content='" + display
+ "',remark='" + remark + "' WHERE ename='" + ename
+ "' AND data='" + data + "'";
JDBCSqlHelper.update(sql);
MessageHelper.ShowMessage("保存成功!");
this.dispose();
}
那么最后在传递的这个this就是在修改页面关闭以后,刷新jtable的。
public FrmCodeModify() {
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
((FrmSysCodeMng)jf).BindTable();
}
});
InitForm();
}
好了洗洗睡吧,我靠,才中午,是吃饭才对,吃晚饭,话说这java一次编译,到处运行,在linux上来一下。先把生成的jar包导出到我的windows7的FTP服务文件夹中。在linux查看
好的,将GRLZ.JAR和JBDC4驱动拷贝至/opt/GRLZ/下
设置JDBC的环境变量
OK,现在运行起来,打开终端,输入如下命令,界面打开
可是我的密码怎么也输不进去
于是乎,我直接点击登录按钮,弹出提示
我靠自从弹出这个提示后,密码可以输入了,我靠,这个时候我最想问那些爱问别人原理的面试官,这是什么原理,为什么会这样。
直接报找不到JDBC驱动,老夫郁闷了,搞了大半天还没搞好,放弃吧,哪位高人如果进来了,给我指点一下。
https://blog.51cto.com/leelei/1331230