多年以前,老夫在西安中科院培训J2EE,交了8000元,培训三个月。出来之后找工作,正值金融危机,幸好老夫命好,在西工大参加南京四连帮(联创,国电,擎天,还有一个忘了)的招聘会。最终老夫以18分(总分是20分)应聘到南京擎天科技。11月份签了三方协议,到来年的3月份毁约。当时我郁闷坏了,在西安使劲找工作,最后都没人要。郁闷了,最后一个偶尔的机会,我一个哥们从一个公司辞职,让我去顶替,结果就去了,就算还有一份工作,月薪1800,做.net。就这样我放弃了java。废话不多说,开始我的重拾。
今天是要将一个C#的小程序翻译成JAVA的,话说这Eclipse工具确实不如VS。我们的界面如下
C#版本的设计如下
JAVA版的设计如下
今天就先看一下主页面的一些代码和用户注册的一些代码。
首先要实现的是主界面上当鼠标移到按钮上,按钮字体颜色变成红色的功能,当然不能是一个一个去写事件。而是给它们注册同样的事件处理程序。
private void RegisterEvent() { foreach (var contrl in this.Controls) { if (contrl.GetType() == typeof(Button)) { Button btn = contrl as Button; btn.MouseHover += delegate(object sender, EventArgs e) { btn.BackColor = Color.Crimson; }; btn.MouseLeave += delegate(object sender, EventArgs e) { btn.BackColor = Color.White; }; if (btn.Name != "btnLogOut") { btn.Click += delegate(object sender, EventArgs e) { this.ShowDialogForm(sender); }; btn.KeyDown += delegate(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { this.ShowDialogForm(sender); } }; } } } }
那么在JAVA中如何一下子注册所有按钮的事件呢
private void RegisterButtonEvent(JComponent component) { Component[] childComponents = component.getComponents(); if (childComponents.length > 0) { for (Component cp : childComponents) { if (cp instanceof JButton) // 如果获取的元素是button { ((JButton) cp) .addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { ((JButton) e.getComponent()) .setForeground(Color.red); } }); ((JButton) cp).addMouseListener(new MouseAdapter() { @Override public void mouseExited(MouseEvent e) { ((JButton) e.getComponent()) .setForeground(Color.black); } }); } else { RegisterButtonEvent((JComponent) cp); } } } }
这段代码的意思是循环遍历页面控件,如果是按钮,就注册一个单击事件监听器。
然后直接在JFrame构造函数调
RegisterButtonEvent(this.contentPane);
这样就可以实现所有按钮的事件。
接下来就是主页面上面的时间,大家都知道,在C#中有个控件叫Timer,很容易实现时间的走动。
private void timer1_Tick(object sender, EventArgs e) { this.tsslTime.Text = DateTime.Now.ToString(); }
那么Java中可以没有这个控件,咋办呢,只能用线程了,每秒sleep一次。
private class Timer extends Thread { private final int interval = 1000; public Timer() { } public void run() { while(1==1) { try { Thread.sleep(interval); SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss"); labCurTime.setText(df.format(new Date())); } catch(InterruptedException ex) { ex.printStackTrace(); } } } }
写好这个线程类之后,在构造函数调用,便可以实现每秒时间都在变化。
Timer tim=new Timer(); tim.start();
OK,这个是主界面的一些介绍,接下来我们看如何从主界面弹出另一个frame。
btnUserRegister.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { FrmUserRegister frmUserReg = new FrmUserRegister(); frmUserReg.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); StartMain.SetMidScreen(frmUserReg); frmUserReg.setVisible(true); } });
给注册用户按钮注册一个事件监听器,实现鼠标单击事件。new 一个jframe窗口,设置其关闭操作我dispose。即点击关闭X之后,该界面立即销毁。
StartMain.SetMidScreen方法是让弹出的窗口居中显示在屏幕。代码如下
public static void SetMidScreen(Component jcomponent) { Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); int width = dimension.width; int height = dimension.height; jcomponent.setLocation((width - jcomponent.getWidth()) / 2, (height - jcomponent.getHeight()) / 2); }
这段代码不做解释,一看就明白。OK,最后一个点,我不想在用户只是在点击X的会后关闭。我想放置一个按钮关闭,那么怎么办呢?
btnCancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ((JFrame)(contentPane.getTopLevelAncestor())).dispose(); } });
第一种方式,直接根据contentPane拿到最上层的component,即jframe,然后dispose。
第二种方式,写另外一个方法,然后直接在这个方法中dispose。
private void WindowClose() { this.dispose(); }
建议使用第二种,简单效率高。
这样的话在点击取消按钮的时候该窗口会被关掉。好了,时间不早了,下节主要是对这个界面功能如何实现的一个讲解,牵涉java连接SqlServer2008,JDBC执行保存等内容。