Java Swing用戶界面設(shè)計:序
Swing是什么
Swing屬于JFC(Java Foundation Classes)的一部分。JFC包含了AWT,Swing,輔助功能API,Java2D,拖放。Swing的出現(xiàn)是為了解決AWT(Abastract Window Toolkit)的移植性和提供更多的企業(yè)級應(yīng)用程序所需要的功能。Swing建立在核心AWT庫上,JDK1.2以及更高的版本已經(jīng)包含了Swing庫。
Swing內(nèi)部采用了MVC體系結(jié)構(gòu)(modle-view-controller)。modle負責(zé)存放Swing組件的狀態(tài)(數(shù)據(jù)),controller負責(zé)處理事件,view負責(zé)繪制圖形。Swing使用了簡化的MVC變體,controller和view合并稱為UI代理。這種設(shè)計使得一個modle可以對應(yīng)多個UI代理,因此非常靈活。
第一個簡單的Swing組件
我的這個Swing組件非常簡單,只是一個toolbar。參考下面的實現(xiàn)代碼:
- package test1;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- /**
- *
- * @author root
- */
- public class ToolbarFrame extends Frame{
- /** Creates a new instance of ToolbarFrame */
- public ToolbarFrame() {
- super("My Toolbar(Swing)");//通過調(diào)用基類Frame的構(gòu)造函數(shù)初始化標題欄文字
- setSize(450,250);
- addWindowListener(new WindowAdapter()
- {
- public void windowClosing(WindowEvent e)
- {
- System.exit(0);
- }
- });
- }
- }
注意紅色代碼是創(chuàng)建了一個內(nèi)部類,該類是WindowAdapter的子類,并且重寫了虛函數(shù)windowClosing。然后將該類的引用交由TollbarFrame管理,通過方法addWindowListener。
如果沒有這步,我們的toolbar可以顯示,但是用不會被關(guān)閉。
現(xiàn)在創(chuàng)建調(diào)用代碼:
- package test1;
- /**
- *
- * @author root
- */
- public class Main {
- /** Creates a new instance of Main */
- public Main() {
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- ToolbarFrame toolbar=new ToolbarFrame();
- toolbar.setVisible(true);
- }
- }
調(diào)用代碼只有兩行,非常簡單?,F(xiàn)在我們來看看運行的效果,見下圖:
由于沒有設(shè)置窗口的起始位置,所以默認停留在屏幕左上方。
既然我們使用Net Beans來開發(fā)程序,Net Beans向?qū)б部梢詾槲易鐾瑯拥氖虑椤Mㄟ^使用newJFrame Form來創(chuàng)建一個ToolbarFrame2類。我們獲得下面的代碼:
- package test1;
- /**
- *
- * @authorroot
- */
- public class ToolbarFrame2 extends javax.swing.JFrame {
- /** Creates new form ToolbarFrame2 */
- public ToolbarFrame2() {
- initComponents();
- }
- /** This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
- */
- // <editor-fold defaultstate="collapsed" desc=" Generated Code ">
- private void initComponents() {
- setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
- javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
- getContentPane().setLayout(layout);
- layout.setHorizontalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 400, Short.MAX_VALUE)
- );
- layout.setVerticalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 300, Short.MAX_VALUE)
- );
- pack();
- }// </editor-fold>
- /**
- * @param args the command line arguments
- */
- public static void main(String args[]) {
- java.awt.EventQueue.invokeLater(new Runnable() {
- public void run() {
- new ToolbarFrame2().setVisible(true);
- }
- });
- }
我們獲得了沒有標題的ToolbarFrame2,并且已經(jīng)可以響應(yīng)關(guān)閉按鈕。
注意,我們的ToolbarFrame2類從JFrame派生,而不是Frame。Frame是AWT的類,而JFrame是Swing提供的類。我們應(yīng)該盡量使用Swing類。
private void initComponents() 方法的實現(xiàn)涉及到 GroupLayout類等細節(jié),后面會逐漸介紹。關(guān)于JFrame類的文檔請參考下面的鏈接
http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE)中,使用了類WindowConstants的公有靜態(tài)整形常量,這些常量分別代表窗口關(guān)閉時的行為,具體可以參考
http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html#windowevents。
我們可以通過調(diào)用JFrame的成員函數(shù)setTitle來設(shè)置標題。
添加控件
在Net Beans IDE中,我們可以使用編輯器進行可視化編輯(通過Design視圖),比如添加一個JButton。向?qū)槲覀兌x如下變量:
- // Variables declaration - do not modify
- private javax.swing.JButton jButton1;
- // End of variables declaration
并且在private void initComponents() 方法中增加下面一行:
- jButton1 = new javax.swing.JButton();
事件處理
所有的Swing類以及派生類都擁有方法public void addActionListener(ActionListener 。l)
該方法可以添加事件的監(jiān)聽者,當有事件發(fā)生,Swing組件就會調(diào)用這些監(jiān)聽者的public void actionPerformed(java.awt.event.ActionEvent evt)方法。形成事件回調(diào)。我們可以利用Net Beans為我們創(chuàng)建這些注冊的代碼。右鍵點擊JButton,然后選擇events->action->actionPerformed,Net Beans將創(chuàng)建私有方法actionPerformed,然后在initComponents方法中增加下面的代碼:
- jButton1.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- jButton1ActionPerformed(evt);
- }
- });
我們只需要將 我們的處理邏輯寫到j(luò)Button1ActionPerformed私有方法中就可以響應(yīng)事件了。
如果我們有兩個JButton控件,Net Beans將為我們創(chuàng)建兩個私有方法,并且創(chuàng)建兩個繼承自ActionListener的內(nèi)部類,確保不會互相干擾。請看下面的實例代碼:
- private void initComponents() {
- jButton1 = new javax.swing.JButton();
- jButton2 = new javax.swing.JButton();
- setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
- jButton1.setText("Button1");
- jButton1.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- jButton1ActionPerformed(evt);
- }
- });
- jButton2.setText("Button2");
- jButton2.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- jButton2ActionPerformed(evt);
- }
- });
ActionEvent對象能夠提供很多的信息,請參考文檔:http://java.sun.com/javase/6/docs/api/java/awt/event/ActionEvent.html。
原文鏈接:http://yangyou230.iteye.com/blog/1307786
【編輯推薦】