狂神說Java個人筆記-GUI編程


簡介

Gui的核心技術:swing AWT

1.因為界面不美觀

2.需要jre環境!

為什么我們要學習?

1.可以寫出自己心中想要的一些小工具

2.工作時候,也可能需要維護到swing界面,概率極小!

3.了解MVC架構,了解監聽!

AWT

介紹

1.包含了很多類和接口!GUI

2.元素:窗口,按鈕,文本框

3.java.awt

組件和容器

1.Frame

//GUI的第一個界面
public static void main(String[] args) {
   //Frame JDK 看源碼
   Frame frame = new Frame("我的第一個java圖形界面窗口");
   //需要設置可見性
   frame.setVisible(true);
   //設置窗口大小
   frame.setSize(800,800);
   //設置背景顏色 Color
   frame.setBackground(new Color(32, 92, 9));
   //彈出的初始位置
   frame.setLocation(300,300);
   //設置大小固定
   frame.setResizable(false);
}

嘗試設置多個窗口,繼承Frame,利用封裝。寫個方法,然后調用類創建

public class Demo2 {
   public static void main(String[] args) {
       MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.RED);
       MyFrame myFrame2 = new MyFrame(100, 300, 200, 200, Color.RED);
       MyFrame myFrame3 = new MyFrame(300, 100, 200, 200, Color.RED);
       MyFrame myFrame4 = new MyFrame(300, 300, 200, 200, Color.RED);

  }

}
class MyFrame extends Frame{
   static int id =0;//若設置多個窗口,用計數器
   public MyFrame(int x,int y,int w,int h, Color color){
       super("MyFrame"+(++id));
       setVisible(true);
       setBackground(color);
       setBounds(x,y,w,h);
       setResizable(false);
  }
}

2.面板Panel

public static void main(String[] args) {
   Frame frame = new Frame();
   Panel panel = new Panel();
   //設置布局
   frame.setLayout(null);
   //坐標
   frame.setBounds(100,100,500,500);
   frame.setBackground(new Color(18, 109, 62));
   //panel設置坐標背景顏色
   panel.setBounds(50,50,300,300);
   panel.setBackground(new Color(133, 25, 20));
   //frame.add(panel)
   frame.add(panel);
   frame.setVisible(true);
   //監聽事件監聽窗口關閉System.exit(0)
   //適配器模式
   frame.addWindowListener(new WindowAdapter() {
       //點擊窗口關閉要做的事情
       @Override
       public void windowClosing(WindowEvent e) {
           //結束程序
           System.exit(0);
      }
  });
}

布局方法:

  • 流式布局

  • public static void main(String[] args) {
       Frame frame = new Frame();
       //組件-按鈕
       Button button1 = new Button("button1");
       Button button2 = new Button("button2");
       Button button3 = new Button("button3");
       Button button4 = new Button("button4");
       //設置為流式布局
       frame.setLayout(new FlowLayout());
       frame.setLayout(new FlowLayout(FlowLayout.LEFT));//從左開始流式布局
       frame.setLayout(new FlowLayout(FlowLayout.RIGHT));//從右開始流式布局
       frame.setBounds(100,100,500,500);
       //添加按鈕
       frame.add(button1);
       frame.add(button2);
       frame.add(button3);
       frame.add(button4);
       frame.setVisible(true);

    }
  • 東西南北中

  • public static void main(String[] args) {
       Frame f = new Frame("TestBorderLayout");
       Button east = new Button("East");
       Button west = new Button("West");
       Button south = new Button("South");
       Button north = new Button("North");
       Button center = new Button("Center");
       f.add(east,BorderLayout.EAST);
       f.add(west,BorderLayout.WEST);
       f.add(south,BorderLayout.SOUTH);
       f.add(north,BorderLayout.NORTH);
       f.add(center,BorderLayout.CENTER);
       f.setSize(300,300);
       f.setVisible(true);
    }
  • 表格布局

  • public static void main(String[] args) {
       Frame f = new Frame("TestGridLayout");
       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");
       f.setLayout(new GridLayout(3,2));
       f.add(btn1);
       f.add(btn2);
       f.add(btn3);
       f.add(btn4);
       f.add(btn5);
       f.add(btn6);
       f.pack();//java函數!自動布局
       f.setVisible(true);
    }

    練習

    public static void main(String[] args) {
       Frame frame = new Frame("練習");
       //窗口設置
     frame.setBackground(Color.black);
     frame.setBounds(100,100,400,300);
     frame.setVisible(true);
     frame.setLayout(new GridLayout(2,1));
     //創建四個面板
       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));
       //創建1和2的button
       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);
       //創建3和4d1button
       p3.add(new Button("East-2"),BorderLayout.EAST);
       p3.add(new Button("West-2"),BorderLayout.WEST);
       p4.add(new Button("p4-btn-1"));
       p4.add(new Button("p4-btn-2"));
       p4.add(new Button("p4-btn-3"));
       p4.add(new Button("p4-btn-4"));
       p3.add(p4,BorderLayout.CENTER);


       //添加面板
       frame.add(p1);
       frame.add(p3);
       //關閉界面
       //監聽事件監聽窗口關閉System.exit(0)
       //適配器模式
       frame.addWindowListener(new WindowAdapter() {
           //點擊窗口關閉要做的事情
           @Override
           public void windowClosing(WindowEvent e) {
               //結束程序
               System.exit(0);
          }
      });

    image-20200521172102136

    總結:

    1. Frame是一個頂級窗口

    2. Paner無法單獨顯示,必須添加到某個容器中。

    3. 布局管理器

1.流式

2.東西南北中

3.表格

4.大小,定位,背景顏色,可見性,監聽。

簡易計算器,組合+內部類回顧

oop原則:組合,大於繼承!

目前代碼

 public static void main(String[] args) {
       //主程序
       new Calculator();
  }
}
//計算機類
class Calculator extends Frame{


   public Calculator(){
       //三個文本框
       TextField num1 = new TextField(10);
       TextField num2 = new TextField(10);
       TextField num3 = new TextField(20);
       //一個button按鈕
       Button button = new Button("=");
       button.addActionListener(new MyCalculator(num1,num2,num3)) ;

       //一個標簽
       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 MyCalculator implements ActionListener{
       //獲取三個變量
   private  TextField num1,num2,num3;
   public MyCalculator( TextField num1, TextField num2, TextField num3){
       this.num1=num1;
       this.num2=num2;
       this.num3=num3;

  }
   @Override
   public void actionPerformed(ActionEvent e) {
       //1.獲得加數被加數
       Integer in1=Integer.parseInt(num1.getText());
       Integer in2=Integer.parseInt(num2.getText());
       //2.將值加法運算后放到第三框
       num3.setText(""+(in1+in2));
       //3.清除前兩個框
       num1.setText("");
       num2.setText("");
  }
}

 

全面向對象寫法

   public static void main(String[] args) {
        //主程序
        new Calculator();
    }
}
//計算機類
class Calculator1 extends Frame{
    //屬性:
    TextField num1,num2,num3;
    //方法
    public void loadFrame(){
        //三個文本框
       num1 = new TextField(10);
       num2 = new TextField(10);
       num3 = new TextField(20);
        //一個button按鈕
        Button button = new Button("=");
        button.addActionListener(new MyCalculator1(this)) ;

        //一個標簽
        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 MyCalculator1 implements ActionListener {
    //獲取計算器對象 在一個類中組合另外一個類
    Calculator1 calculator1=null;
    public MyCalculator1(Calculator1 calculator1 ){
         this.calculator1=calculator1;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //1.獲得加數被加數
        Integer in1=(Integer.parseInt(calculator1.num1.getText()));
        Integer in2=(Integer.parseInt(calculator1.num2.getText()));
        //2.將值加法運算后放到第三框
        calculator1.num3.setText(""+(in1+in2));
        //3.清除前兩個框
       calculator1.num1.setText("");
       calculator1.num2.setText("");
    }
}

 

內部類

  public static void main(String[] args) {
        new Calculator2();
    }
}
class Calculator2 extends Frame{
    //屬性   三個文本框 一個button 一個標簽
    TextField num1,num2,num3;
    Button button;
    Label label;
    //方法
    public void loginFrame(){
        num1=new TextField(10);
        num2=new TextField(10);
        num3=new TextField(20);
        button=new Button("=");
        button.addActionListener(new CaclActionListener());
        label=new Label("+");
        //布局
        setLayout(new FlowLayout());//流式布局
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);
        pack();//自動優化布局
        setVisible(true);
    }
    private class CaclActionListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            //獲取加數被加數
            Integer in1=Integer.parseInt(num1.getText());
            Integer in2=Integer.parseInt(num2.getText());
            //將加法運算后方到第三個
            num3.setText(""+(in1+in2));
            //清空前兩個框
            num1.setText("");
            num2.setText("");
        }
    }
}

內部類最大特點:可以暢通無阻的訪問外部類的方法,屬性

畫筆

  public static void main(String[] args) {
        new MyPaint().loadFrame();
    }
}
class MyPaint extends Frame{
    public void loadFrame(){
        setBounds(200,200,600,500);
        setVisible(true);
       addWindowListener(new WindowAdapter() {
            //點擊窗口關閉要做的事情
            @Override
            public void windowClosing(WindowEvent e) {
                //結束程序
                System.exit(0);
            }
        });
    }
    //畫筆
    @Override
    public void paint(Graphics g){
        //畫筆,需要有顏色,畫筆可以畫畫
        //g.drawOval(100,100,100,100);
        g.fillOval(100,100,100,100);//實心圓
        g.setColor(Color.GREEN);
        g.fillRect(150,200,200,200);
        //畫筆用完,將他還原到最初的顏色
    }
}

 

鼠標監聽

package com.dong.gui.lestion;

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

/**
 * @author dong
 * @date 2020/5/22 - 15:27
 */
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<>();
        //鼠標監聽器,針對當前窗口
        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 frame= (MyFrame) e.getSource();
            //我們點擊的時候,就會在界面上產生一個點!
            //這個點就是鼠標的點:
            frame.addPaint(new Point(e.getX(),e.getY()));
            //每次點擊鼠標都需要重新畫一遍
            frame.repaint();//刷新
        }
    }
}

 

窗口監聽

public class TestWindow {
    public static void main(String[] args) {
        new WindowFrame();
    }
}
class WindowFrame extends Frame{
    public WindowFrame() {
        setBackground(Color.GREEN);
        setBounds(100,100,200,200);
        setVisible(true);
        this.addWindowListener(
                //匿名內部類
                new WindowAdapter() {
                    //關閉窗口
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                    //激活窗口

                    @Override
                    public void windowActivated(WindowEvent e) {
                        WindowFrame source = (WindowFrame) e.getSource();
                        source.setTitle("已激活");
                        System.out.println("windowActivated");
                    }
                }
        );

    }

}

 

###

鍵盤監聽

public class TestKey {
    public static void main(String[] args) {

    }
}
class KeyFrame extends Frame{
    public KeyFrame(){
        setBounds(100,100,400,400);
        setVisible(true);
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int keyCode=e.getKeyCode();//使用靜態屬性
                System.out.println(keyCode);
                if(keyCode==KeyEvent.VK_UP){
                    System.out.println("你按了上鍵");
                }
            }
        });
    }
}

 

3.Swing 對AWT的演化

 public void init(){
        //頂級窗口
        JFrame jf = new JFrame("這是個JFrame窗口");
        jf.setBounds(100,100,200,200);
        jf.setVisible(true);
        //設置文字Jlable
        JLabel label = new JLabel("歡迎來到我的設計");
        jf.add(label);
        //讓文本標簽居中 設置水平對齊
        label.setHorizontalAlignment(SwingConstants.CENTER);
        //關閉事件
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //創建一個容器,顏色更改在容器里
        Container contentPane = jf.getContentPane();
        contentPane.setBackground(Color.GREEN);
    }
    public static void main(String[] args) {
        //建立一個窗口!
        new JFrameDemo().init();
    }
}


 

彈窗

JDialog,用來被彈出,默認就有關閉事件!

//主窗口

public class DialogDemo extends JFrame {
    public DialogDemo(){
        this.setSize(700,500);
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //JFrame放東西,容器
        Container container=this.getContentPane();
        //絕對布局
        container.setLayout(null);
        //按鈕
        JButton button = new JButton("點擊彈出一個對話框");
        button.setBounds(30,30,200,50);
        //點擊這個按鈕的時候,彈出一個彈窗
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //彈窗
                new MyDialogDemo();
            }
        });
        container.add(button);
    }

    public static void main(String[] args) {
        new DialogDemo();
    }
}
//彈窗的窗口
class MyDialogDemo extends JDialog{
    public MyDialogDemo() {
        this.setVisible(true);
        this.setBounds(100,100,500,500);
        Container container=this.getContentPane();
        container.setLayout(null);
        container.add(new Label("這是一個彈窗!"));
    }
}

 

標簽

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM