多年以前,老夫在西安中科院培训J2EE,交了8000元,培训三个月。出来之后找工作,正值金融危机,幸好老夫命好,在西工大参加南京四连帮(联创,国电,擎天,还有一个忘了)的招聘会。最终老夫以18分(总分是20分)应聘到南京擎天科技。11月份签了三方协议,到来年的3月份毁约。当时我郁闷坏了,在西安使劲找工作,最后都没人要。郁闷了,最后一个偶尔的机会,我一个哥们从一个公司辞职,让我去顶替,结果就去了,就算还有一份工作,月薪1800,做.net。就这样我放弃了java。废话不多说,开始我的重拾。


今天是要将一个C#的小程序翻译成JAVA的,话说这Eclipse工具确实不如VS。我们的界面如下

C#版本的设计如下

重拾JAVA之WinForm实战之(一)_第1张图片

JAVA版的设计如下

重拾JAVA之WinForm实战之(一)_第2张图片

今天就先看一下主页面的一些代码和用户注册的一些代码。

首先要实现的是主界面上当鼠标移到按钮上,按钮字体颜色变成红色的功能,当然不能是一个一个去写事件。而是给它们注册同样的事件处理程序。

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之WinForm实战之(一)_第3张图片

这样的话在点击取消按钮的时候该窗口会被关掉。好了,时间不早了,下节主要是对这个界面功能如何实现的一个讲解,牵涉java连接SqlServer2008,JDBC执行保存等内容。