0基礎學GUI,先從基礎開始1

Wisdex發表於2020-11-22

在這裡插入圖片描述

1、AWT

1.2 基本介紹

  • 包含很多的類和介面
  • 元素:視窗、按鈕、文字框
  • java.awt
    在這裡插入圖片描述

1.2、Frame

import java.awt.*;

//GUI的第一個介面
public class TestFrame {
    public static void main(String[] args) {
        //1、例項化一個Frame(可在JDK中看原始碼學習)
        Frame frame = new Frame("我的第一個java圖形介面視窗");

        //2、設定可見性
        frame.setVisible(true);

        //3、設定視窗大小
        frame.setSize(800,600);

        //4、設定背景顏色
        frame.setBackground(new Color(255, 55, 55));

        //5、彈出的初始位置
        frame.setLocation(20,20);

        //6、視窗可否改變
        frame.setResizable(false);

    }
}

在這裡插入圖片描述

  • 展示多個視窗
import java.awt.*;

public class TestFrame2 {
    public static void main(String[] args) {
        //展示多個視窗
        MyFrame mf1 = new MyFrame(10, 10, 200, 200, Color.black);
        MyFrame mf2 = new MyFrame(10, 210, 200, 200, Color.red);
        MyFrame mf3 = new MyFrame(210, 10, 200, 200, Color.green);
        MyFrame mf4 = new MyFrame(210, 210, 200, 200, Color.yellow);
    }
}

class MyFrame extends Frame{
    //設定一個計數器
    static int id = 0;
    public MyFrame(int x, int y, int w, int h,Color color){

        super("Myframe" + (++id));

        setBounds(x,y,w,h);
        setBackground(color);
        setResizable(false);
        setVisible(true);
    }
}

在這裡插入圖片描述

1.3、Panel

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestPanel {
    public static void main(String[] args) {
        Frame frame = new Frame();

        //開始佈局
        Panel panel = new Panel();

        //設定佈局
        frame.setLayout(null);
        frame.setBounds(20,20,400,400);
        frame.setBackground(new Color(218, 61, 49));

        //panel設定
        panel.setBounds(40,40,100,100);
        panel.setBackground(Color.darkGray);

        //加入皮膚
        frame.add(panel);

        //顯示
        frame.setVisible(true);

        //如何關閉視窗?
        //監聽事件,介面卡模式,選擇windowsClosing
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                //結束程式
                System.exit(0);
            }
        });
    }
}

在這裡插入圖片描述

1.4、佈局管理器

  • 流式佈局

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestFlowLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("FlowLayout");

        //元件-按鈕
        Button button1 = new Button("button1");
        Button button2 = new Button("button2");
        Button button3 = new Button("button3");

        //設定流式佈局
//        frame.setLayout(new FlowLayout());//預設居中
//        frame.setLayout(new FlowLayout(FlowLayout.LEFT));//左對齊
        frame.setLayout(new FlowLayout(FlowLayout.RIGHT));//右對齊

        frame.setSize(200,200);

        //把按鈕新增上去
        frame.add(button1);
        frame.add(button2);
        frame.add(button3);

        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
  • 東西南北中

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestBorderLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("BorderLayout");

        //元件-按鈕
        Button east = new Button("East");
        Button south = new Button("South");
        Button west = new Button("West");
        Button north = new Button("North");
        Button center = new Button("Center");

        frame.add(east,BorderLayout.EAST);
        frame.add(south,BorderLayout.SOUTH);
        frame.add(west,BorderLayout.WEST);
        frame.add(north,BorderLayout.NORTH);
        frame.add(center,BorderLayout.CENTER);

        frame.setSize(200,200);
        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
  • 表格佈局

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestGridLayout {
    public static void main(String[] args) {
        Frame frame = new Frame();

        Button btn1 = new Button("btn1");
        Button btn2 = new Button("btn2");
        Button btn3 = new Button("btn3");
        Button btn4 = new Button("btn4");
        Button btn5 = new Button("btn5");
        Button btn6 = new Button("btn6");

        frame.setLayout(new GridLayout(3,2));

        frame.add(btn1);
        frame.add(btn2);
        frame.add(btn3);
        frame.add(btn4);
        frame.add(btn5);
        frame.add(btn6);

//        frame.setSize(200,200);
        frame.pack();//自動填充合適的大小
        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
  • ExperientDemo

在這裡插入圖片描述

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class ExperientDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("ExperientDemo");

        frame.setSize(400,300);
        frame.setLocation(300,400);
        frame.setBackground(Color.BLACK);
        frame.setVisible(true);

        //先上下分2框
        frame.setLayout(new GridLayout(2,1));

        //4個皮膚
        Panel p1 = new Panel(new BorderLayout());
        Panel p2 = new Panel(new GridLayout(2, 1));
        Panel p3 = new Panel(new BorderLayout());
        Panel p4 = new Panel(new GridLayout(2, 2));

        p1.add(new Button("East-1"),BorderLayout.EAST);
        p1.add(new Button("West-1"),BorderLayout.WEST);
        p2.add(new Button("p2-btn-1"));
        p2.add(new Button("p2-btn-2"));
        p1.add(p2,BorderLayout.CENTER);

        p3.add(new Button("East-3"),BorderLayout.EAST);
        p3.add(new Button("West-3"),BorderLayout.WEST);
        for (int i = 0; i < 4; i++) {
            p4.add(new Button("for-" + i));
        }
        p3.add(p4,BorderLayout.CENTER);

        frame.add(p1);
        frame.add(p3);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });


    }
}

1.5、事件監聽

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestAction {
    public static void main(String[] args) {
        //按下按鈕,觸發事件
        Frame frame = new Frame();
        Button button = new Button();
        //例項化一個監聽事件
        MyActionListener myActionListener = new MyActionListener();
        //按鈕新增監聽事件
        button.addActionListener(myActionListener);

        frame.add(button,BorderLayout.CENTER);
        frame.pack();

        //關閉視窗
        windowClose(frame);

        frame.setVisible(true);

    }

    //關閉視窗的事件
    public static void windowClose(Frame frame) {
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

//關閉視窗的事件
class MyActionListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("aaa");
    }
}
  • 多個按鈕共享一個事件
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestActionTwo {
    public static void main(String[] args) {
        //兩個按鈕,實現同一個監聽
        //開始、停止
        Frame frame = new Frame();
        Button button1 = new Button("start");
        Button button2 = new Button("stop");

        button2.setActionCommand("button2-stop");

        MyMonitor myMonitor = new MyMonitor();

        button1.addActionListener(myMonitor);
        button2.addActionListener(myMonitor);

        frame.add(button1,BorderLayout.NORTH);
        frame.add(button2,BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

class MyMonitor implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        //e.getActionCommand() 獲取按鈕的資訊
        System.out.println("按鈕被點選了:msg=>" + e.getActionCommand());
    }
}

1.6、輸入框TextField監聽

  • 1、建立main方法psvm,新建一個MyFrame方法

  • 2、新建MyFrame類並繼承Frame類

    • 3、新建公眾public的MyFrame()方法

      • 4、例項化一個文字框物件TextField:testField

      • 5、新增add,值為testField

      • 10、例項化一個MyActionListener監聽物件:myActionListener

      • 11、testField新增行動監聽方法.addActionListener,值為myActionListener

      • 17、testField設定回聲字元.setEchoChar,輸入時看到都是*,系統可正常獲取

      • 12、打包pack()

      • 13、設定顯示setVisible,值為真true

      • 14、新增視窗監聽addWindowListener,值為一個新的視窗介面卡WindowAdapter

        • 15、重寫視窗關閉windowClosing方法

          • 16、系統System的退出.exit,值為0
  • 6、新建一個MyActionListener類繼承ActionListener介面

    • 7、重寫動作執行方法actionPerformed
      • 8、獲得一些資源的方法e.getsoure(),並強制轉化為對話方塊(TextField),在賦值給對話方塊類TextField的field
      • 9、field獲得輸入框文字的方法.getText,並列印輸出sout
      • 18、field設定文字.setTest,值空,實現回車清空的效果
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestText01 {
    public static void main(String[] args) {
        //main方法主要功能就是啟動
        new MyFrame();
    }
}

class MyFrame extends Frame{
    public MyFrame(){
        //例項化一個文字框
        TextField textField = new TextField();
        add(textField);

        //輸入完成回車後,觸發這個輸入框事件
        MyActionListener2 myActionListener2 = new MyActionListener2();
        //監聽文字框中輸入的文字
        textField.addActionListener(myActionListener2);

        //設定回聲字元,輸入時看到都是*,系統可正常獲取
        textField.setEchoChar('*');

        pack();
        setVisible(true);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

class MyActionListener2 implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        TextField field = (TextField)e.getSource();//獲得一些資源,返回一個物件
        System.out.println(field.getText());//獲得輸入框中的文字
        field.setText(""); //回車清空
    }
}

1.7、簡易計算器

第一次嘗試:程式導向

  • 1、建立main方法
    • 13、新建計算器方法Calculator()
  • 2、建立計算器類Calculator,繼承Frame
    • 3、新建計算器方法Calculator()
      • 6、新建3個文字框TextField:num1、num2、num3,值為字元數分別為:10,10,20
      • 7、新建1個按鈕Button:button,值為“=”
      • 14、button新增行為監聽方法.addActionListener(),值為新建我的計算器監聽方法MyCalculatorListener(),值為num1、num2、num3
      • 8、新建1個標籤Label:label,值為“+”
      • 9、設定佈局setLayout,值為新建一個流佈局FlowLayout
      • 10、依次加入add:num1,label、num2、button、num3
      • 11、打包pack()
      • 12、設定顯示setVisible,值為真true
      • 21、加入視窗監聽addWindowListener()並實現系統關閉(詳解省略,請看上文)
  • 4、建立計算器監聽類MyCalulatorListener,繼承動作監聽介面ActionListener
    • 15、定義私有變數private、型別為文字框TextField的三個變數:num1、num2、num3
    • 16、定義共有public、我的計算機監聽方法MyCalculatorListener(),值為文字框型別的TextField:num1、num2、num3
      • 17、輸入的num1、num2、num3的值賦值給類中的三個私有變數this.:num1、num2、num3
    • 5、重寫動作執行方法actionPerformed(),值為行為動作類ActionEven:e
      • 18、獲得加數和被加數:變數num1、2先獲取文字方法.getText(),在通過轉化int型方法Integer.parseInt()轉化為int型,最後賦值給int型的變數n*
      • 19、加法運算後返回第三個框:變數num3設定文字方法.setText(),值為n1+n2的和加上+一個空字元“”轉化的String型別
      • 20、清除連個文字框的值:變數1、2設定文字方法.setText(),值為空“”
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//簡易計算器
public class TestCalc {
    public static void main(String[] args) {
        new Calculator();
    }
}

//計算器類
class Calculator extends Frame{
    public Calculator(){
        //3個文字框
        TextField num1 = new TextField(10);     //字元數
        TextField num2 = new TextField(10);     //字元數
        TextField num3 = new TextField(20);     //字元數

        //1個按鈕
        Button button = new Button("=");
        button.addActionListener(new MyCalculatorListener(num1,num2,num3));

        //1個標籤
        Label label = new Label("+");

        //佈局:流式佈局
        setLayout(new FlowLayout());

        //新增
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    }
}

//監聽器類
class MyCalculatorListener implements ActionListener{
    //獲取三個變數
    private TextField num1,num2,num3;

    public MyCalculatorListener(TextField num1,TextField num2,TextField num3){
        this.num1 = num1;
        this.num2 = num2;
        this.num3 = num3;
    }

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

第二次優化:組合,物件導向

  • 1、建立main方法

    • 21、新建計算器方法Calculator2().loadFrame
  • 2、建立計算器類Calculator2,繼承Frame

    • 3、屬性:新建文字框類的三個變數num1、num2、num3

    • 4、新建公眾public、無返回值void、載入框架方法loadFrame()

      • 5、新建3個文字框TextField,值為字元數分別為:10,10,20,賦值為:num1、num2、num3

      • 新建1個標籤Label:label,值為“+”

      • 6、新建1個按鈕Button:button,值為“=”

      • 7、button新增行為監聽方法.addActionListener(),值為新建我的計算器監聽方法MyCalculatorListener(),值為this

      • 8、設定佈局setLayout,值為新建一個流佈局FlowLayout

      • 9、依次加入add:num1,label、num2、button、num3

      • 10、打包pack()

      • 11、設定顯示setVisible,值為真true

      • 12、加入視窗監聽addWindowListener()並實現系統關閉(詳解省略,請看上文)

  • 13、建立計算器監聽類MyCalulatorListener,繼承動作監聽介面ActionListener

    • 14、在一個類中組合另一個類,獲取計算器:Calculatro2型別calculator2,並賦值其為null
    • 15、定義共有public、我的計算機監聽方法MyCalculatorListener(),值為Calculator型別的Calculator
      • 16、輸入的Calculator賦值給this.calculator
    • 5、重寫動作執行方法actionPerformed(),值為行為動作類ActionEven:e
      • 18、獲得加數和被加數:calculator2.num1、2先獲取文字方法.getText(),在通過轉化int型方法Integer.parseInt()轉化為int型,最後賦值給int型的變數n1、n2
      • 19、加法運算後返回第三個框:calculator.num3設定文字方法.setText(),值為n1+n2的和加上+一個空字元“”轉化的String型別
      • 20、清除連個文字框的值:calculator.num1、2設定文字方法.setText(),值為空“”
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//簡易計算器
public class TestCalculat {
    public static void main(String[] args) {
        new Calculator2().loadFrame();
    }
}

//計算器類
class Calculator2 extends Frame{
    //屬性
    TextField num1,num2,num3;

    //方法
    public void loadFrame(){
        //主鍵:3個文字框,1個標籤,1個按鈕
        num1 = new TextField(10);     //字元數
        num2 = new TextField(10);     //字元數
        num3 = new TextField(20);     //字元數
        Label label = new Label("+");
        Button button = new Button("=");

        //監聽器
        button.addActionListener(new MyCalculatorListener2(this));

        //佈局:流式佈局
        setLayout(new FlowLayout());
        //新增
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        //打包、顯示
        pack();
        setVisible(true);

        //視窗關閉
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

//監聽器類
class MyCalculatorListener2 implements ActionListener{
    //在一個類中組合另外一個類,獲取計算器
    Calculator2 calculator2 = null;

    public MyCalculatorListener2(Calculator2 calculator2){
        this.calculator2 = calculator2;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //獲得加數和被加數
        int n1 = Integer.parseInt(calculator2.num1.getText());
        int n2 = Integer.parseInt(calculator2.num2.getText());

        //加法運算後返回到第三個框
        calculator2.num3.setText("" + (n1 + n2));

        //清除前兩個框的值
        calculator2.num1.setText("");
        calculator2.num2.setText("");
    }
}

第三次優化:內部類

  • 1、建立main方法psvm

    • 18、新建計算器方法Calculator2().loadFrame
  • 2、建立計算器類Calculator3,繼承Frame

    • 3、屬性:新建文字框類的三個變數num1、num2、num3

    • 4、新建公眾public、無返回值void、載入框架方法loadFrame()

      • 5、新建3個文字框TextField,值為字元數分別為:10,10,20,賦值為:num1、num2、num3

      • 新建1個標籤Label:label,值為“+”

      • 6、新建1個按鈕Button:button,值為“=”

      • 7、button新增行為監聽方法.addActionListener(),值為新建我的計算器監聽方法MyCalculatorListener(),值為this

      • 8、設定佈局setLayout,值為新建一個流佈局FlowLayout

      • 9、依次加入add:num1,label、num2、button、num3

      • 10、打包pack()

      • 11、設定顯示setVisible,值為真true

      • 12、加入視窗監聽addWindowListener()並實現系統關閉(詳解省略,請看上文)

      • 13、建立計算器監聽類MyCalulatorListener,繼承動作監聽介面ActionListener

      • 14、重寫動作執行方法actionPerformed(),值為行為動作類ActionEven:e

      • 15、獲得加數和被加數:calculator2.num1、2先獲取文字方法.getText(),在通過轉化int型方法Integer.parseInt()轉化為int型,最後賦值給int型的變數n1、n2

      • 16、加法運算後返回第三個框:calculator.num3設定文字方法.setText(),值為n1+n2的和加上+一個空字元“”轉化的String型別

      • 17、清除連個文字框的值:calculator.num1、2設定文字方法.setText(),值為空“”

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//簡易計算器
public class TestCalculator {
    public static void main(String[] args) {
        new Calculator3().loadFrame();
    }
}

//計算器類
class Calculator3 extends Frame{
    //屬性
    TextField num1,num2,num3;

    //方法
    public void loadFrame(){
        //主鍵:3個文字框,1個標籤,1個按鈕
        num1 = new TextField(10);     //字元數
        num2 = new TextField(10);     //字元數
        num3 = new TextField(20);     //字元數
        Label label = new Label("+");
        Button button = new Button("=");

        //監聽器
        button.addActionListener(new MyCalculatorListener3());

        //佈局:流式佈局
        setLayout(new FlowLayout());
        //新增
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        //打包、顯示
        pack();
        setVisible(true);

        //視窗關閉
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    }

    //監聽器類
    private class MyCalculatorListener3 implements ActionListener{

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

1.8、畫筆

  • 1、建立main方法psvm
    • 18、新建畫筆方法MyPaint().loadFrame()
  • 2、建立畫筆類MyPaint,繼承Frame
    • 3、新建公眾public、無返回值void、載入框架方法loadFrame()
      • 設定邊界setBounds,值為20,20處實現600*600的框架
      • 設定可見方法,值為真(詳情省略)
    • 重寫畫筆:公眾的public、無返回值void、畫筆方法paint(),值為Graphics類的g
      • 設定顏色方法.setcolor(),值為顏色類的紅色red
      • 繪製空心圓方法.drawOval(),值為50,50處繪製100*100的空心圓
      • 繪製實心圓方法.fillOval(),值為150,150處繪製100*100的實心圓
      • 設定顏色方法.setcolor(),值為顏色類的黃色yellow
      • 繪製實心長方形方法.fillRect(),值為200,20處繪製200*100的實心長方形
      • 最後,當畫筆用完後,將他的顏色還原成預設黑色:設定顏色方法.setcolor(),值為顏色類的黑色black
import java.awt.*;

public class TestPaint {
    public static void main(String[] args) {
        new MyPaint().loadFrame();
    }
}

class MyPaint extends Frame{
    public void loadFrame(){
        setBounds(20,20,600,600);
        setVisible(true);
    }
    //畫筆
    @Override
    public void paint(Graphics g){
        g.setColor(Color.red);      //選擇顏色:紅
        g.drawOval(50,50,100,100);      //繪製100*100的空心圓
        g.fillOval(150,150,100,100);        //繪製100*100的實心圓

        g.setColor(Color.yellow);       //設定顏色:黃
        g.fillRect(200,20,200,100);     //繪製200*100的實心長方形

        //養成習慣,畫筆用完,將他還原成最初的顏色
        g.setColor(Color.black);
    }
}

1.9、滑鼠監聽

在這裡插入圖片描述

  • 1、建立main方法psvm

    • 18、新建框架方法MyFram(),值為畫圖
  • 2、建立我的框架類MyFrame,繼承Frame

    • 11、屬性佇列ArrayList一個點points

    • 3、新建公眾public、我的框架方法MyFrame(),值為String型別的標題title

      • 4、super(),值為title

      • 12、設定邊界方法setBounds(),值為200,200,長度400,寬度300的長方形

      • 13、存滑鼠點選的點:新建佇列,賦值到點points

      • 22、設定可見方法setVisible(),值為真true

      • 5、新增滑鼠監聽:this.addMouseListener(),值為新建一個我的滑鼠監聽方法MyMouseListener()

    • 6、重寫公眾的public,無返回值void,畫筆方法paint(),值為Graphics型別的g

      • 14、將點points的迭代方法iterator()賦值給迭代器型別Iterator的iterator

      • 15、while迴圈,值為如果iterator後面還有

        • 16、iterator的下面next()賦值給Point型別的point

        • 17、設定顏色方法g.setColor(),值為藍色

        • 18、設定實心圓方法g.fillOval(),值為point.x,point.y,寬度10,高度10

    • 19、新增一個點到介面上:公眾的public、無返回值void、新增點方法addPaint(),值為Point型別的point

      • 20、點points新增add(),值為point
    • 7、私有的private、我的滑鼠監聽類MyMouseListener,繼承滑鼠介面卡MouseAdapter

      • 8、重寫滑鼠點選方法:公共的public、無返回值viod、滑鼠點選方法mousePressed(),值為滑鼠事件類MouseEven的e
        • 9、獲得資源e.getSource(),強制轉換(MyFrame),並賦值於MyFrame類的myFrame
        • 10、新建一個Point(),值為e.getX(),e.getY()
        • 21、我的框架myFrame,新增點的方法.addpaint(),值為Point()
        • 23、設定重畫.repaint(),讓每次點選滑鼠都需要重畫一次,相當於是重新整理
package cn.wisdex.lesson03;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;

public class TestMouseListener {
    public static void main(String[] args) {
        new MyFrame("畫圖");
    }
}

class MyFrame extends Frame{
    ArrayList points;

    public MyFrame(String title)  {
        super(title);
        setBounds(200,200,400,300);

        //存滑鼠點選的點
        points = new ArrayList<>();

        setVisible(true);

        //新增滑鼠
        this.addMouseListener(new MyMouseListener());
    }

    @Override
    public void paint(Graphics g) {
        //畫畫,監聽滑鼠的事件
        Iterator iterator = points.iterator();
        while (iterator.hasNext()){
            Point point = (Point)iterator.next();
            g.setColor(Color.BLUE);
            g.fillOval(point.x,point.y,10,10);
        }

    }

    //新增一個點到介面上
    public void addPaint(Point point){
        points.add(point);
    }


    //通過繼承滑鼠介面卡模式,重新方法
    private class MyMouseListener extends MouseAdapter{
        @Override
        public void mousePressed(MouseEvent e) {
            MyFrame myFrame = (MyFrame) e.getSource();
            //確定滑鼠的點
            myFrame.addPaint(new Point(e.getX(),e.getY()));

            //每次點選滑鼠都需要重畫一遍,相當於是重新整理
            myFrame.repaint();
        }
    }
}

相關文章