重拾JAVA之WinForm實戰之(一)

多年以前,老夫在西安中科院培訓J2EE,交了8000元,培訓三個月。出來之後找工作,正值金融危機,幸好老夫命好,在西工大參加南京四連幫(聯創,國電,擎天,還有一個忘了)的招聘會。最終老夫以18分(總分是20分)應聘到南京擎天科技。11月份簽了三方協議,到來年的3月份毀約。當時我鬱悶壞了,在西安使勁找工作,最後都沒人要。鬱悶了,最後一個偶爾的機會,我一個哥們從一個公司辭職,讓我去頂替,結果就去了,就算還有一份工作,月薪1800,做.net。就這樣我放棄了java。廢話不多說,開始我的重拾。


今天是要將一個C#的小程序翻譯成JAVA的,話說這Eclipse工具確實不如VS。我們的界面如下

C#版本的設計如下

192050922.png

JAVA版的設計如下

192225805.png

今天就先看一下主頁面的一些代碼和用戶註冊的一些代碼。

首先要實現的是主界面上當鼠標移到按鈕上,按鈕字體顏色變成紅色的功能,當然不能是一個一個去寫事件。而是給它們註冊同樣的事件處理程序。

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

建議使用第二種,簡單效率高。

225002433.png

這樣的話在點擊取消按鈕的時候該窗口會被關掉。好了,時間不早了,下節主要是對這個界面功能如何實現的一個講解,牽涉java連接SqlServer2008,JDBC執行保存等內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章