Java基礎—GUI

  一、GUI——圖形化界面,人與計算機交流的橋樑。java.awt:重量級控件,需要調用本地系統方法實現。javax.swing:輕量級控件,完全由java實現,增強可移植性。
  二、佈局管理器:容器中組件的排放方式。

  1. 流式佈局(FlowLayout):從左到右佈局;
  2. 邊界式佈局(BorderLayout):上北下南左西右東,不指定方位,填充整個區域,是默認的佈局方式。
  3. 網格式佈局(GridLayout):比如計算器式佈局;
  4. 網格包式佈局(GridBagLayout):組件佔多個格子;
  5. 卡片式佈局(CardLayout):比如屬性佈局。
    注:當一個窗體涉及多個佈局方式時,需先將窗體用面板(Panel)劃分,再添加組件。
      三、GUI的製作步驟:

        1、創建Frame窗體;
       &emso;2、對Frame窗體做基本設置,比如:大小、位置、佈局等;
        3、創建組件;
        4、用Frame的add功能將組件添加到Frame窗體中;
        5、添加監聽器;
        6、讓窗體顯示,f.setVisiable(true);
      四、事件監聽機制:先確定事件源,確定事件,確定添加哪種監聽器,做出何種處理。
        1、WindowListener:窗體事件監聽器,比如關閉窗體;
        2、ActionListener:活動監聽器,活動事件;
        3、MouseListener:鼠標監聽器,點擊(雙擊)、滑過、移出、按下時、釋放時;
        4、KeyListener:鍵盤監聽器:鍵入、按下時、釋放時。
      五、練習
    1、讀取目錄

/*
 讀取目錄:
 步驟:
      1、先做出圖形界面;
      2、再添加監聽器;
      3、容錯處理;
      4、添加鍵盤迴車事件。

其他說明:1、ta.setText():添加新內容時,之前的內容會被覆蓋;
             ta.append():將內容追加到後面
          2、TextField:創建時可以指定列數;
          3、TextArea:創建時,參數列表:行數、列數;
          4、Dialog:參數列表:所屬窗體,對話框名稱,狀態模式;

注:監聽器一個一個添加,添加一個測試一個,全部添加再測試問題不好找。
    我添加的順序:窗體關閉監聽器、添加按鈕監聽器、對話框監聽器、文本框監聽器。
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class GuiTest
{
    //基本的Frame窗體,及組件
    private Frame f;
    private TextField tf;
    private Button b;
    private TextArea ta;
    //彈出對話框及裏面的組件
    private Dialog d;
    private Button okB;
    private Label l;
    GuiTest()
    {
        init();
    }
    public void init()
    {
        //創建Frame窗體
        try
        {
            f = new Frame("my frame");
            //對Frame窗體進行基本的設置
            f.setBounds(300,200,600,500);
            f.setLayout(new FlowLayout());

            tf = new TextField(54);
            b = new Button("轉到");
            ta = new TextArea(26,60);

            //將組件添加到Frame窗體中
            f.add(tf);
            f.add(b);
            f.add(ta);

            //給窗體綁定事件
            myEvent();

            //顯示窗體
            f.setVisible(true);
        }

        catch (Exception e)
        {
            throw new RuntimeException("窗體建立失敗");
        }
    }
    //事件函數
    public void myEvent()
    {
        //添加窗體關閉事件
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });

        //添加按鈕事件
        b.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                buttonEvent();
            }
        });
        //添加文本框事件
        tf.addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                if(e.getKeyCode() == KeyEvent.VK_ENTER)
                {
                    buttonEvent();
                }
            }
        });
    }
    //按鈕、回車鍵觸發的事件相同,所以提取出來
    public void buttonEvent()
    {
        //獲取文本框內容,並將封裝成File對象
        String dirPath = tf.getText();
        File dir = new File(dirPath);
        //如果是目錄,則將目錄下的文件名寫在文本區域
        if(dir.exists() && dir.isDirectory())
        {
            ta.setText("");
            String[] names = dir.list();
            for(String name : names)
            {
                ta.append(name+"\r\n");
            }
        }
        //如果不是目錄,彈出對話框
        else
        {
            try
            {
                //建立對話框及組件
                d = new Dialog(f,"提示",true);
                okB = new Button("確定");
                l = new Label();

                //對對話框做基本設置
                d.setBounds(500,300,200,100);
                d.setLayout(new FlowLayout());

                //想對話框中添加組件
                d.add(l);
                d.add(okB);

                //想標籤裏添加文字
                l.setText("目錄不存在,請重新輸入!");

                //給對話框添加關閉對話框事件
                d.addWindowListener(new WindowAdapter()
                {
                    public void windowClosing(WindowEvent e)
                    {
                        d.setVisible(false);
                    }
                });
                //給確定按鈕對象添加關閉對話框的事件
                okB.addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent e)
                    {
                        d.setVisible(false);
                    }
                });

                d.setVisible(true);
            }
            catch (Exception ie)
            {
                throw new RuntimeException("對話框添加失敗!");
            }
        }
    }
    public static void main(String[] args) 
    {
        new GuiTest();
    }
}

2、簡單的文本編輯器

/*
文本編輯器:

步驟:1、做好界面;
      2、添加監聽器;
      3、容錯處理;

其他說明:文本打開對話框和文本保存對話框都是用FileDialog創建的,文本打開對話框用:FileDialog.LOAD模式;
          而文本保存對話框用:FileDialog.SAVE模式。彈出文本保存對話框之前,需要判斷文本是否已經存在,
          若存在不彈文本保存對話框,直接保存,若不存在,則彈文本保存對話框。
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenu
{
    //創立窗體及組件
    private Frame f;
    private TextArea ta;
    //菜單欄及菜單
    private MenuBar bar;
    private Menu filem;
    private MenuItem openm;
    private MenuItem savem;
    private MenuItem exitm;
    //打開文本、保存文本框
    private FileDialog openfd,savefd;

    //用於將文件的目錄封裝成File對象
    private File dir;

    MyMenu()
    {
        init();
    }
    public void init()
    {
            //創建窗體,並對其做基本設置
            f = new Frame("我的文本編輯器");
            f.setBounds(300,200,600,500);

            //創建窗體組件
            ta = new TextArea();
            bar = new MenuBar();

            //添加窗體組件
            f.setMenuBar(bar);
            f.add(ta);

            //創建菜單
            filem = new Menu("文件");
            openm = new MenuItem("打開");
            savem = new MenuItem("保存");
            exitm = new MenuItem("退出");

            //將菜單添加到菜單欄
            bar.add(filem);
            filem.add(openm);
            filem.add(savem);
            filem.add(exitm);

            //創建保存、打開文本框
            openfd = new FileDialog(f,"打開",FileDialog.LOAD);
            savefd = new FileDialog(f,"保存",FileDialog.SAVE);

            //綁定窗體事件
            myEvent();

            //顯示窗體
            f.setVisible(true);

    }
    public void myEvent()
    {
        //添加關閉窗體事件
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
        //添加退出事件
        exitm.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });
        //添加打開事件
        openm.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                //點擊“打開”,彈出打開文本對話框
                openfd.setVisible(true);
                //獲取文本存儲路徑及名字
                String path = openfd.getDirectory();
                String name = openfd.getFile();
                //System.out.println(name+path);
                //容錯處理
                if(path == null || name == null)
                    return;
                //打開新的文本之前,先清空文本區域
                ta.setText("");
                //將文本存放路徑封裝成File對象
                dir = new File(path,name);

                try
                {
                    //建立讀取流,並與指定文本相關聯
                    BufferedReader bufr = new BufferedReader(new FileReader(dir));
                    String line = null;
                    //從硬盤讀取文本並書寫到文本區域
                    while((line = bufr.readLine()) != null)
                    {
                        ta.append(line+"\r\n");
                    }
                    //關閉讀取流
                    bufr.close();
                }
                catch (IOException ie)
                {
                    throw new RuntimeException("讀取文件失敗!");
                }

            }
        });
        //添加保存事件
        savem.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                //打開文本保存對話框之前,先判斷該文本是否存在,
                if(dir == null)
                {
                    //若不存在彈出文本保存對話框
                    savefd.setVisible(true);
                    //獲取文本保存路徑及名字
                    String path = savefd.getDirectory();
                    String name = savefd.getFile();
                    //容錯處理
                    if(path == null || name == null)
                        return;

                    //將路徑及文本名稱封裝成File對象
                    dir = new File(path,name);
                    try
                    {
                        //建立寫流,將文本區域的文本寫到指定硬盤裏
                        BufferedWriter bufw = new BufferedWriter(new FileWriter(dir));
                        String text = ta.getText();
                        //System.out.println(text);
                        bufw.write(text);
                        //關閉寫流
                        bufw.close();
                    }
                    catch (IOException ie)
                    {
                        throw new RuntimeException("文件保存失敗");
                    }

                }
                //如果文本存在,不彈文本保存對話框
                else
                {
                    try
                    {
                        //建立寫流,將文本區域的內容,寫到硬盤中
                        BufferedWriter bufw = new BufferedWriter(new FileWriter(dir));
                        String text = ta.getText();
                        bufw.write(text);
                        bufw.close();
                    }
                    catch(IOException ie)
                    {}
                }
            }
        });
    }
    public static void main(String[] args) 
    {
        new MyMenu();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章