界面开发

195 阅读5分钟

Swing

在 Java 中,GUI 操作的支持 API,一般保存在 java.awt 和 javax.swing 包中。

  • java.awt 包中提供的 AWT(Abstract Window Toolkit,抽象窗口工具包)界面开发 API,适合早期 Java 版本。
  • javax.swing 包中提供的 Swing 界面开发 API, 功能比 AWT 更加强大, 是 Java2推出的,成为 JavaGUI 开发的首选。其中,javax 中的“x”是扩展的意思。

用JFrame类开发窗口

步骤:

  1. 创建一个窗体对象
  2. 设置窗体对象的属性
  3. 创建组件对象
  4. 设置组件对象的属性
  5. 将组件对象加载到窗体对象上 我们使用的按钮、文本框统称为控件,在 Java 中,有时又称 Component(组件)。控件一般都有相应的类来实 现,比如,最常见的控件是按钮,在 Java 中就是用 JButton 类来实现的。
package jiemian;

import javax.swing.*;
import java.awt.*;

public class LoginUI{

    public void initUI(){
        /**
         * 1: 创建一个窗体对象
          */
        JFrame jf = new JFrame ("登录界面");

        /**
         * 2: 设置窗体对象的属性
         * 标题  尺寸  关闭选项 可视化
         */
//      jf.setTitle ();
        jf.setSize (600,800);
        jf.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
   

        /**
         * 3: 创建组件对象
         * 按钮  输入框  文字图片标签 选择框
         */
        JButton btn = new JButton ("登录");
        JTextField namein = new JTextField ();
        JPasswordField pwdin = new JPasswordField();

        JLabel nameJla = new JLabel ("账号:");
        JLabel pwdJla = new JLabel ("密码:");

        // 图片图标类 ImageIcon
        ImageIcon img  = new ImageIcon ("C:\Users\haishu\Desktop\背景\kangna.jpg");
        JLabel imhjla = new JLabel (img);

        JCheckBox checkBox = new JCheckBox("记住密码");

        /**
         *  4:设置组件对象的属性
         */
         
        // 尺寸设置:
        Dimension dim = new Dimension (510,50);
        namein.setPreferredSize (dim);
        pwdin.setPreferredSize (dim);


        /**
         * 5: 将组件对象加载到窗体对象上
         */
        // 布局 : JFrame 边框布局 东西南北中
        FlowLayout fl = new FlowLayout ();
        jf.setLayout (fl);// 设置流式布局  自动布局

        jf.add (imhjla);
        jf.add (nameJla); jf.add (namein);
        jf.add (pwdJla); jf.add (pwdin);
        jf.add (checkBox); jf.add (btn);

        // 可视化 组件加载完成之后可视化
        jf.setVisible (true);
        
        //MyLoginListener ml = new MyLoginListener ();
       //btn.addActionListener (ml);
       //ml.namein  =  namein;
       //ml.pwdin  = pwdin; 

    }

    public static void main(String[] args){
        LoginUI loginui = new LoginUI ();
        loginui.initUI ();
    }
}

在 Java 中,布局由布局管理器:java.awt.LayoutManager 来管理。 打开文档,找到java.awt.LayoutManager,会发现这是一个接口,并不能直接实例化。此时,我们可以使用该接口的实现类。 java.awt.LayoutManager 最常见的实现类有:

  1. java.awt.FlowLayout:将组件按从左到右而后从上到下的顺序依次排列,一行放不下则到下一行继续放置。
  2. java.awt.GridLayout:将界面布局为一个无框线的表格,每个单元格中放一个组件。
  3. java.awt.BorderLayout:将组件按东、南、西、北、中五个区域放置,每个方向最多只能放置一个组件。

监听器

界面上有一个按钮。但是,当点击按钮时,却没有任何反应。显然,真正丰富多彩的程序中,我们点击按钮,至少需要能做点事情。比如,点击按钮,在控制台上打印一个字符串:Hello。该功能如何实现呢?

  • 事件。简单讲,事件是指用户为了交互而产生的键盘和鼠标动作。比如,点击按钮,就可以认为发出了一个“按钮点击事件”。事件是有种类的。比如,按钮点击,是一种事件;鼠标在界面上移动,也是一种事件;等等。要处理某事件,首先必须搞清楚事件的种类。
  • 使用监听器的步骤:
  1. 创建一个监听器类 实现(implements) 监听器接口
  2. 实现这个接口中所有的抽象方法 (重写接口中所有的抽象方法)
  3. 将监听器对象绑在产生事件的组件上
MyLoginListener ml = new MyLoginListener ();
btn.addActionListener (ml);
package jiemian;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyLoginListener implements ActionListener{
    // 将需要传入的数据变量 声明为一个空的 
    JTextField namein;
    JPasswordField pwdin;
    
    // 点击按钮之后会响应的 
    @Override
    public void actionPerformed(ActionEvent e){
        System.out.println ("按钮被点击了");
        // ActionEvent 事件类 e 事件对象获取对象属性
        JButton btn = (JButton) e.getSource (); // 返回所点击的按钮对象
        String btnstr = btn.getText ();
        System.out.println ("按钮上的文本:"+btnstr);
        // 获取监听组件上的命令字符串
        String commandstr = e.getActionCommand ();
        System.out.println ("组件字符串:"+commandstr);

        // 获取输入框中的字符串
        //必须在点击按钮之后执行,所以需要将初始化方法中的输入框对象传给监听器对象中的输入框属性
        String nameStr = namein.getText();
        String pwdStr = pwdin.getText ();

        System.out.println ("账号:"+nameStr+" \n密码:"+pwdStr);
    }
}

应用实例

用鼠标画三角形

MouseEvent

鼠标事件包括按下鼠标按键、释放鼠标按键、单击鼠标按键(按下并释放) 、鼠标光标进入组件几何形状的未遮掩部分、鼠标光标离开组件几何形状的未遮掩部分。此时,MouseEvent 用java.awt.event.MouseListener接口监听。该接口中有如下函数:

  • void mouseClicked(MouseEvent e):鼠标按键在组件上单击(按下并释放)时调用。
  • void mousePressed(MouseEvent e):鼠标按键在组件上按下时调用。
  • void mouseReleased(MouseEvent e):鼠标按钮在组件上释放时调用。
  • void mouseEntered(MouseEvent e):鼠标进入到组件上时调用。
  • void mouseExited(MouseEvent e):鼠标离开组件时调用。

鼠标移动事件,包括移动鼠标和拖动鼠标。此 时 , MouseEvent 用 java.awt.event.MouseMotionListener 接口监听。该接口中有如下函数:

  • void mouseDragged(MouseEvent e):鼠标拖动时调用。
  • void mouseMoved(MouseEvent e):鼠标移动时调用。
    Graphics

Graphics类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制。 Graphics对象封装了 Java 支持的基本呈现操作所需的状态信息。此状态信息包括以下属性:

  • 要在其上绘制的 Component 对象。
  • 呈现和剪贴坐标的转换原点。
  • 当前剪贴区。
  • 当前颜色。
  • 当前字体。
  • 当前逻辑像素操作函数(XOR 或 Paint)。
  • 当前 XOR 交替颜色(参见 setXORMode(java.awt.Color))。
package draw;

import javax.swing.*;
import java.awt.*;

public class DrawUI {

    public void initUI(){
        JFrame jf = new JFrame("图形图像绘制");
        jf.setSize(1000,1000);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);

        DrawListener dl = new DrawListener();
        jf.addMouseListener(dl);
        Graphics g =jf.getGraphics();
        dl.g = g;
    }

    public static void main(String[] args){
        DrawUI drawUI = new DrawUI();
        drawUI.initUI();

    }
}
package draw;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class DrawListener implements MouseListener {
    Graphics g;
    int x1, y1, x2, y2, x3, y3;

    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();

        System.out.println("点击 x="+x+",y="+y);

    }

    @Override
    public void mousePressed(MouseEvent e) {
        x1 = e.getX();
        y1 = e.getY();
        System.out.println("按下 x="+x1+",y="+y1);

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        x2 = e.getX();
        y2 = e.getY();
        x3 = Math.min(x1,x2);
        y3 = Math.max(y1,y2);
        g.drawLine(x1,y1,x2,y2);
        g.drawLine(x1,y1,x3,y3);
        g.drawLine(x2,y2,x3,y3);
        System.out.println("释放 x="+x2+",y="+y2);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("进入");

    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("离开");

    }
}