java必學必會之GUI編程。本站提示廣大學習愛好者:(java必學必會之GUI編程)文章只能為提供參考,不一定能成為您想要的結果。以下是java必學必會之GUI編程正文
1、事宜監聽
測試代碼一:
package cn.javastudy.summary; import java.awt.*; import java.awt.event.*; public class TestTextField { public static void main(String args[]) { new MyFrameTextField(); } } class MyFrameTextField extends Frame { MyFrameTextField() { TextField tf = new TextField(); add(tf); tf.addActionListener(new Monitor3()); tf.setEchoChar('*'); /* * 這個setEchoChar()辦法是設置文本框輸出時顯示的字符,這裡設置為*, * 如許輸出任何內容就都以*顯示出來,不外打印出來時仍然可以看到輸出的內容 */ setVisible(true); pack(); } } class Monitor3 implements ActionListener { /* * 接口外面的一切辦法都是public(公共的) * 所以從API文檔復制void actionPerformed(ActionEvent e)時 要在void後面加上public */ public void actionPerformed(ActionEvent e) { /* 事宜的相干信息都封裝在了對象e外面,經由過程對象e的相干辦法便可以獲得事宜的相干信息 */ TextField tf = (TextField) e.getSource(); /* * getSource()辦法是拿到事宜源,留意:拿到這個事宜源的時刻, * 是把它看成TextField的父類來看待 * getSource()辦法的界說是:“public Object getSource()”前往值是一個Object對象, * 所以要強迫轉換成TextField類型的對象 * 在一個類外面想拜訪別的一個類的事宜源對象可以經由過程getSource()辦法 */ System.out.println(tf.getText());// tf.getText()是獲得文本框外面的內容 tf.setText("");// 把文本框外面的內容清空 } }
測試代碼二:
package cn.javastudy.summary; import java.awt.*; import java.awt.event.*; public class TestActionEvent2{ public static void main(String args[]){ Frame f = new Frame("TestActionEvent"); Button btn1 = new Button("start"); Button btn2 = new Button("stop"); Monitor2 m2 = new Monitor2();//創立監聽對象 btn1.addActionListener(m2); /*一個監聽對象同時監聽兩個按鈕的舉措*/ btn2.addActionListener(m2); btn2.setActionCommand("GameOver");//設置btn2的履行單擊敕令後的前往信息 f.add(btn1,BorderLayout.NORTH); f.add(btn2,BorderLayout.CENTER); f.pack(); f.setVisible(true); } } class Monitor2 implements ActionListener{ public void actionPerformed(ActionEvent e){ System.out.println("a button has been pressed,"+"the relative info is:\n"+e.getActionCommand()); /*應用前往的監聽對象e挪用getActionCommand()辦法獲得兩個按鈕履行單擊敕令後的前往信息 依據前往信息的分歧辨別開以後操作的是哪個按鈕,btn1沒有應用setActionCommand()辦法設置 則btn1前往的信息就是按鈕上顯示的文本*/ } }
2、TextField事宜監聽
測試代碼:
package cn.javastudy.summary; import java.awt.*; import java.awt.event.*; public class TestTextField { public static void main(String args[]) { new MyFrameTextField(); } } class MyFrameTextField extends Frame { MyFrameTextField() { TextField tf = new TextField(); add(tf); tf.addActionListener(new Monitor3()); tf.setEchoChar('*'); /* * 這個setEchoChar()辦法是設置文本框輸出時顯示的字符,這裡設置為*, * 如許輸出任何內容就都以*顯示出來,不外打印出來時仍然可以看到輸出的內容 */ setVisible(true); pack(); } } class Monitor3 implements ActionListener { /* * 接口外面的一切辦法都是public(公共的) * 所以從API文檔復制void actionPerformed(ActionEvent e)時 要在void後面加上public */ public void actionPerformed(ActionEvent e) { /* 事宜的相干信息都封裝在了對象e外面,經由過程對象e的相干辦法便可以獲得事宜的相干信息 */ TextField tf = (TextField) e.getSource(); /* * getSource()辦法是拿到事宜源,留意:拿到這個事宜源的時刻, * 是把它看成TextField的父類來看待 * getSource()辦法的界說是:“public Object getSource()”前往值是一個Object對象, * 所以要強迫轉換成TextField類型的對象 * 在一個類外面想拜訪別的一個類的事宜源對象可以經由過程getSource()辦法 */ System.out.println(tf.getText());// tf.getText()是獲得文本框外面的內容 tf.setText("");// 把文本框外面的內容清空 } }
應用TextField類完成簡略的盤算器
package cn.javastudy.summary; import java.awt.*; import java.awt.event.*; public class TestMath { public static void main(String args[]) { new TFFrame(); } } /* 這裡重要是完成盤算器元素的結構 */ class TFFrame extends Frame { TFFrame() { /* * 創立3個文本框,並指定其初始年夜小分離為10個字符和15個字符的年夜小 這裡應用的是TextField類的別的一種結構辦法 public TextField(int columns) */ TextField num1 = new TextField(10); TextField num2 = new TextField(10); TextField num3 = new TextField(15); /* 創立等號按鈕 */ Button btnEqual = new Button("="); btnEqual.addActionListener(new MyMonitor(num1, num2, num3)); /* 給等號按鈕加上監聽,讓點擊按鈕後有呼應事宜產生 */ Label lblPlus = new Label("+"); /* “+”是一個靜態文本,所以應用Label類創立一個靜態文本對象 */ setLayout(new FlowLayout()); /* 把Frame默許的BorderLayout結構改成FlowLayout結構 */ add(num1); add(lblPlus); add(num2); add(btnEqual); add(num3); pack(); setVisible(true); } } class MyMonitor implements ActionListener { TextField num1, num2, num3; /* * 為了使對按鈕的監聽可以或許對文本框也起感化, * 所以在自界說類MyMonitor外面界說三個TextField類型的對象 num1,num2,num3, * 而且界說了MyMonitor類的一個結構辦法 這個結構辦法帶有三個TextField類型的參數, * 用於吸收 從TFFrame類外面傳遞過去的三個TextField類型的參數 * 然後把吸收到的三個TextField類型的參數賦值給在本類中聲明的 三個TextField類型的參數num1,num2,num3 然後再在actionPerformed()辦法外面處置num1,num2,num3 */ public MyMonitor(TextField num1, TextField num2, TextField num3) { this.num1 = num1; this.num2 = num2; this.num3 = num3; } public void actionPerformed(ActionEvent e) { /* 事宜的相干信息都封裝在了對象e外面,經由過程對象e的相干辦法便可以獲得事宜的相干信息 */ int n1 = Integer.parseInt(num1.getText());/* num1對象挪用getText()辦法獲得本身顯示的文本字符串 */ int n2 = Integer.parseInt(num2.getText());/* num2對象挪用getText()辦法獲得本身顯示的文本字符串 */ num3.setText("" + (n1 + n2));/* num3對象挪用setText()辦法設置本身的顯示文本 */ num1.setText(""); /* 盤算停止後清空num1,num2文本框外面的內容 */ num2.setText(""); // num3.setText(String.valueOf((n1+n2))); /* 字符串與隨意率性類型的數據應用“+”銜接時獲得的必定是字符串, * 這裡應用一個空字符串與int類型的數銜接,如許便可以直接把(n1+n2)獲得的int類型的數隱式地轉換成字符串了, * 這是一種把其余基本數據類型轉換成字符串的一個小技能。 * 也能夠應用“String.valueOf((n1+n2))”把(n1+n2)的和轉換成字符串 */ } }
JAVA外面的經典用法:在一個類外面持有別的一個類的援用
package cn.javastudy.summary; import java.awt.*; import java.awt.event.*; public class TestMath1 { public static void main(String args[]) { new TTMyFrame().launchFrame(); /* 創立出TTMyFrame對象後挪用lauchFrame()辦法把盤算器窗體顯示出來 */ } } /* 做好盤算器的窗體界面 */ class TTMyFrame extends Frame { /* 把設計盤算器窗體的代碼封裝成一個辦法 */ TextField num1, num2, num3; public void launchFrame() { num1 = new TextField(10); num2 = new TextField(15); num3 = new TextField(15); Label lblPlus = new Label("+"); Button btnEqual = new Button("="); btnEqual.addActionListener(new MyMonitorbtnEqual(this)); setLayout(new FlowLayout()); add(num1); add(lblPlus); add(num2); add(btnEqual); add(num3); pack(); setVisible(true); } } /* * 這裡經由過程獲得TTMyFrame類的援用,然後應用這個援用去拜訪TTMyFrame類外面的成員變量 * 這類做法比上一種直接去拜訪TTMyFrame類外面的成員變量要好很多, * 由於如今不須要曉得 TTMyFrame類外面有哪些成員變量了, * 如今要拜訪TTMyFrame類外面的成員變量,直接應用 TTMyFrame類對象的援用去拜訪便可, * 這個TTMyFrame類的對象比如是一個年夜管家, 而我告知年夜管家,我要拜訪TTMyFrame類外面的那些成員變量, * 年夜管家的援用就會去幫我找,不再須要我本身去找了。 * 這類在一個類外面持有另外一個類的援用的用法是一種異常典范的用法 * 應用獲得到的援用便可以在一個類外面拜訪另外一個類的一切成員了 */ class MyMonitorbtnEqual implements ActionListener { TTMyFrame ttmf = null; public MyMonitorbtnEqual(TTMyFrame ttmf) { this.ttmf = ttmf; } public void actionPerformed(ActionEvent e) { int n1 = Integer.parseInt(ttmf.num1.getText()); int n2 = Integer.parseInt(ttmf.num2.getText()); ttmf.num3.setText("" + (n1 + n2)); ttmf.num1.setText(""); ttmf.num2.setText(""); } }
運轉成果以下:
3、外部類
外部類的應用典范:
package cn.javastudy.summary; import java.awt.*; import java.awt.event.*; public class TestMath3 { public static void main(String args[]) { new MyMathFrame().launchFrame(); } } class MyMathFrame extends Frame { TextField num1, num2, num3; public void launchFrame() { num1 = new TextField(10); num2 = new TextField(15); num3 = new TextField(15); Label lblPlus = new Label("+"); Button btnEqual = new Button("="); btnEqual.addActionListener(new MyMonitor()); setLayout(new FlowLayout()); add(num1); add(lblPlus); add(num2); add(btnEqual); add(num3); pack(); setVisible(true); } /* * 這個MyMonitor類是外部類,它在MyFrame類外面界說 MyFrame類稱為MyMonitor類的包裝類 */ /* * 應用外部類的利益: * 第一個偉大的利益就是可以通順無阻地拜訪內部類(即外部類的包裝類)的一切成員變量和辦法 * 如這裡的在MyFrame類(內部類)界說的三個成員變量num1,num2,num3, * 在MyMonitor(外部類)外面便可以直接拜訪 * 這相當於在創立內部類對象時外部類對象默許就具有了一個內部類對象的援用 */ private class MyMonitor implements ActionListener { public void actionPerformed(ActionEvent e) { int n1 = Integer.parseInt(num1.getText()); int n2 = Integer.parseInt(num2.getText()); num3.setText("" + (n1 + n2)); num1.setText(""); num2.setText(""); } } }
外部類帶來的偉大利益是:
4、Graphics 類
測試代碼:
package cn.javastudy.summary; import java.awt.*; public class TestPaint{ public static void main(String args[]){ new MyPaint().launchFrame(); /*在main()辦法外面並沒有顯示挪用paint(Graphics g)辦法 可是當創立出Frame窗體後卻可以看到Frame窗體上畫出了 圓和矩形,這是由於paint()辦法是一個比擬特別的辦法 在創立Frame窗體時會主動隱式挪用 當我們把Frame窗體最小化又再次翻開時,又會再次挪用 paint()辦法從新把圓和矩形在Frame窗體上畫出來 即每次須要重畫Frame窗體的時刻就會主動挪用paint()辦法*/ } } class MyPaint extends Frame{ public void launchFrame(){ setBounds(200,200,640,480); setVisible(true); } public void paint(Graphics g){ /*paint(Graphics g)辦法有一個Graphics類型的參數g 我們可以把這個g看成是一個畫家,這個畫家手裡拿著一只畫筆 我們經由過程設置畫筆的色彩與外形來畫出我們想要的各類各樣的圖象*/ /*設置畫筆的色彩*/ g.setColor(Color.red); g.fillOval(100,100,100,100);/*畫一個實心橢圓*/ g.setColor(Color.green); g.fillRect(150,200,200,200);/*畫一個實心矩形*/ /*這上面的兩行代碼是為了寫法式的優越編程習氣而寫的 後面設置了畫筆的色彩,如今就應當把畫筆的初始色彩恢復過去 就相當因而畫家用完畫筆以後把畫筆上的色彩清算失落一樣*/ Color c = g.getColor(); g.setColor(c); } }
運轉成果:
5、鼠標事宜適配器
測試代碼:
package cn.galc.test; import java.awt.*; import java.awt.event.*; import java.util.*; public class MyMouseAdapter{ public static void main(String args[]) { new MyFrame("drawing..."); } } class MyFrame extends Frame { ArrayList points = null; MyFrame(String s) { super(s); points = new ArrayList(); setLayout(null); setBounds(300,300,400,300); this.setBackground(new Color(204,204,255)); setVisible(true); this.addMouseListener(new Monitor()); } public void paint(Graphics g) { Iterator i = points.iterator(); while(i.hasNext()){ Point p = (Point)i.next(); g.setColor(Color.BLUE); g.fillOval(p.x,p.y,10,10); } } public void addPoint(Point p){ points.add(p); } } class Monitor extends MouseAdapter { public void mousePressed(MouseEvent e) { MyFrame f = (MyFrame)e.getSource(); f.addPoint(new Point(e.getX(),e.getY())); f.repaint(); } }
6、window事宜
測試代碼:
package cn.galc.test; import java.awt.*; import java.awt.event.*; public class TestWindowClose{ public static void main(String args[]){ new WindowFrame("封閉WindowFrame"); } } class WindowFrame extends Frame{ public WindowFrame(String s){ super(s); setBounds(200,200,400,300); setLayout(null); setBackground(new Color(204,204,255)); setVisible(true); this.addWindowListener(new WindowMonitor()); /*監聽本窗體的舉措,把一切的舉措信息封裝成一個對象傳遞到監聽類外面*/ this.addWindowListener( /*在一個辦法外面界說一個類,這個類稱為部分類,也叫匿名的外部類, 這裡的{……代碼……}外面的代碼很像一個類的類體,只不外這個類沒著名字,所以叫匿名類 在這裡是把這個匿名類當做WindowAdapter類來應用,語法上如許寫的實質意義是相當於這個匿名類 從WindowAdapter類繼續,如今new了一個匿名類的對象出來然後把這個對象當做WindowAdapter來應用 這個匿名類出了()就沒有人熟悉了*/ new WindowAdapter(){ public void windowClosing(WindowEvent e){ setVisible(false); System.exit(-1); } } ); } /*這裡也是將監聽類界說為外部類*/ class WindowMonitor extends WindowAdapter{ /*WindowAdapter(Window適配器)類完成了WindowListener監聽接口 重寫了WindowListener接口外面的一切辦法 假如直接應用自界說WindowMonitor類直接去 完成WindowListener接口,那末就得要重寫WindowListener接口 外面的一切辦法,但如今只須要用到這些辦法外面的個中一個辦法 所以采取繼續完成WindowListener監聽接口的一個子類 偏重寫這個子類外面須要用到的誰人辦法便可 這類做法比直接完成WindowListener監聽接口要重寫許多個用不到的辦法要簡練便利很多*/ /*重寫須要用到的windowClosing(WindowEvent e)辦法*/ public void windowClosing(WindowEvent e){ setVisible(false);/*將窗體設置為不顯示,便可完成窗體封閉*/ System.exit(0);/*正常加入*/ } } }
7、鍵盤呼應事宜——KeyEvent
測試代碼:
package cn.galc.test; import java.awt.*; import java.awt.event.*; public class TestKeyEvent{ public static void main(String args[]){ new KeyFrame("鍵盤呼應事宜"); } } class KeyFrame extends Frame{ public KeyFrame(String s){ super(s); setBounds(200,200,400,300); setLayout(null); setVisible(true); addKeyListener(new KeyMonitor()); } /*把自界說的鍵盤的監聽類界說為外部類 這個監聽類從鍵盤適配器KeyAdapter類繼續 從KeyAdapter類繼續也是為了可以簡練便利 只須要重寫須要用到的辦法便可,這類做法比 直接完成KeyListener接口要簡略便利,假如 直接完成KeyListener接口就要把KeyListener 接口外面的一切辦法重寫一遍,但真正用到的 只要一個辦法,如許重寫其他的辦法但又用不到 不免會做無用功*/ class KeyMonitor extends KeyAdapter{ public void keyPressed(KeyEvent e){ int keycode = e.getKeyCode(); /*應用getKeyCode()辦法獲得按鍵的虛擬碼*/ /*假如獲得到的鍵的虛擬碼等於up鍵的虛擬碼 則表現以後按下的鍵是up鍵 KeyEvent.VK_UP表現獲得up鍵的虛擬碼 鍵盤中的每個鍵都對應有一個虛擬碼 這些虛擬碼在KeyEvent類外面都被界說為靜態常量 所以可使用“類名.靜態常量名”的情勢拜訪獲得這些靜態常量*/ if(keycode == KeyEvent.VK_UP){ System.out.println("你按的是up鍵"); } } } } /*鍵盤的處置事宜是如許的:每個鍵都對應著一個虛擬的碼, 當按下某一個鍵時,體系就會去找這個鍵對應的虛擬的碼,以此來肯定以後按下的是誰人鍵 */
經由過程這篇文章和年夜家一路進修了GUI編程,願望年夜家對GUI編程有了更周全的熟悉,關於GUI編程遠不止這些,還須要年夜家持續進修。