Java/Swing 图形界面范例

package com.myth;
import javax.swing.JButton;
import javax.swing.JFrame;

public class JFrameExample1 {
    public static void main(String[] args) {
        // 主窗体
        JFrame frmMain = new JFrame("图形界面范例1");
        // 主窗体设置大小
        frmMain.setSize(800, 600);
        // 主窗体设置位置
        frmMain.setLocation(200, 200);
        // 主窗体中的组件设置为绝对定位
        frmMain.setLayout(null);
        // 按钮组件
        JButton btnOK = new JButton("按钮");
        // 同时设置组件的大小和位置
        btnOK.setBounds(50, 50, 100, 30);
        // 把按钮加入到主窗体中
        frmMain.add(btnOK);
        // 关闭窗体的时候,退出程序
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 让窗体变得可见
        frmMain.setVisible(true);
    }
}

 JFrame是GUI中的容器
JButton是最常见的组件- 按钮
注意:frmMain.setVisible(true); 会对所有的组件进行渲染,所以一定要放在最后面

 Swing 如何进行事件监听

package com.myth;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class JFrameExample2 {

    public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例2");
        frmMain.setSize(800, 600);
        frmMain.setLocation(580, 200);
        frmMain.setLayout(null);
        final JLabel lblImage = new JLabel();
        //图片路径从包开始写而绝对路径是无法显示的
        String path = "com/myth/2.png";  
        ImageIcon pic = new ImageIcon(ClassLoader.getSystemResource(path));
        lblImage.setIcon(pic);
        lblImage.setBounds(50, 50, pic.getIconWidth(), pic.getIconHeight());

        JButton btnOK = new JButton("隐藏图片");
        btnOK.setBounds(150, 200, 100, 30);

        // 给按钮增加监听
        btnOK.addActionListener(new ActionListener() {
            // 当按钮被点击时,就会触发ActionEvent事件
            // actionPerformed方法就会被执行
            public void actionPerformed(ActionEvent e) {
                lblImage.setVisible(false);
            }
        });

        frmMain.add(lblImage);
        frmMain.add(btnOK);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setVisible(true);
    }
}

 创建一个匿名类实现ActionListener接口,当按钮被点击时,actionPerformed方法就会被调用

package com.myth;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class JFrameExample2 {

    public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例2");
        frmMain.setSize(800, 600);
        frmMain.setLocation(580, 200);
        frmMain.setLayout(null);
        final JLabel lblImage = new JLabel();
        //图片路径从包开始写而绝对路径是无法显示的
        String path = "com/myth/2.png";  
        ImageIcon pic = new ImageIcon(ClassLoader.getSystemResource(path));
        lblImage.setIcon(pic);
        lblImage.setBounds(50, 50, pic.getIconWidth(), pic.getIconHeight());

        // 增加键盘监听
        frmMain.addKeyListener(new KeyListener() {
            // 键被弹起
            public void keyReleased(KeyEvent e) {
                // 39代表按下了 “箭头右键”
                if (e.getKeyCode() == 39) {
                    // 图片向右移动 (y坐标不变,x坐标增加)
                    lblImage.setLocation(lblImage.getX() + 10, lblImage.getY());
                }
            }
  
            //键被按下
            public void keyPressed(KeyEvent e) {
                // TODO Auto-generated method stub
            }
  
            // 一个按下弹起的组合动作
            public void keyTyped(KeyEvent e) {
  
            }
        });

        frmMain.add(lblImage);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setVisible(true);
    }
}

 键盘监听器: KeyListener
keyPressed 代表 键被按下
keyReleased 代表 键被弹起
keyTyped 代表 一个按下弹起的组合动作
KeyEvent.getKeyCode() 可以获取当前点下了哪个键

package com.myth;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class JFrameExample2 {

    public static void main(String[] args) {

        final JFrame frmMain = new JFrame("图形界面范例2");
        frmMain.setSize(800, 600);
        frmMain.setLocationRelativeTo(null);
        frmMain.setLayout(null);

        final JLabel lblImage = new JLabel();
         //图片路径从包开始写而绝对路径是无法显示的
        String path = "com/myth/2.png";  
        ImageIcon pic = new ImageIcon(ClassLoader.getSystemResource(path));
        lblImage.setIcon(pic);
        lblImage.setBounds(375, 275, pic.getIconWidth(), pic.getIconHeight());
        frmMain.add(lblImage);

        lblImage.addMouseListener(new MouseListener() {
            // 释放鼠标
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub
            }

            // 按下鼠标
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub
            }

            // 鼠标退出
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub
            }

            // 鼠标进入
            public void mouseEntered(MouseEvent e) {
                Random rnd = new Random();
                int x = rnd.nextInt(frmMain.getWidth() - lblImage.getWidth());
                int y = rnd.nextInt(frmMain.getHeight() - lblImage.getHeight());
                lblImage.setLocation(x, y);
            }

            // 按下释放组合动作为点击鼠标
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
            }
        });

        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setVisible(true);
    }
}

MouseListener 鼠标监听器
mouseReleased 鼠标释放
mousePressed 鼠标按下
mouseExited 鼠标退出
mouseEntered 鼠标进入
mouseClicked 鼠标点击
在本例中,使用mouseEntered,当鼠标进入图片的时候,图片就移动位置

package com.myth;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class JFrameExample2 {

   public static void main(String[] args) {
  
        final JFrame frmMain = new JFrame("图形界面范例2");
        frmMain.setSize(800, 600);
        frmMain.setLocationRelativeTo(null);
        frmMain.setLayout(null);
  
        final JLabel lblImage = new JLabel();
         //图片路径从包开始写而绝对路径是无法显示的
        String path = "com/myth/2.png";  
        ImageIcon pic = new ImageIcon(ClassLoader.getSystemResource(path));
        lblImage.setIcon(pic);
        lblImage.setBounds(375, 275, pic.getIconWidth(), pic.getIconHeight());
        frmMain.add(lblImage);
  
        // MouseAdapter 适配器,只需要重写用到的方法,没有用到的就不用写了
        lblImage.addMouseListener(new MouseAdapter() {
  
            // 只有mouseEntered用到了
            public void mouseEntered(MouseEvent e) {
                Random r = new Random();
                int x = r.nextInt(frmMain.getWidth() - lblImage.getWidth());
                int y = r.nextInt(frmMain.getHeight() - lblImage.getHeight());
                lblImage.setLocation(x, y);
            }
        });
  
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setVisible(true);
    }
}

 MouseAdapter 鼠标监听适配器
一般说来在写监听器的时候,会实现MouseListener。
但是MouseListener里面有很多方法实际上都没有用到,比如mouseReleased ,mousePressed,mouseExited等等。
这个时候就可以使用 鼠标监听适配器,MouseAdapter 只需要重写必要的方法即可。

Java的图形界面中,容器是用来存放 按钮,输入框等组件的。
窗体型容器有两个,一个是JFrame,一个是JDialog

package com.myth;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JFrameExample3 {

  public static void main(String[] args) {
         
        //普通的窗体,带最大和最小化按钮
        JFrame frmMain = new JFrame("图形界面范例3");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        frmMain.setLayout(null);
        JButton btnOK = new JButton("按钮");
        btnOK.setBounds(50, 50, 280, 30);
 
        frmMain.add(btnOK);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

JFrame是最常用的窗体型容器,默认情况下,在右上角有最大化最小化按钮

JDialog也是窗体型容器,右上角没有最大和最小化按钮

package com.myth;

import javax.swing.JButton;
import javax.swing.JDialog;

public class JFrameExample3 {

    public static void main(String[] args) {
        //普通的窗体,带最大和最小化按钮,而对话框却不带
        JDialog dlgForm = new JDialog();
        dlgForm.setTitle("图形界面范例3");
        dlgForm.setSize(400, 300);
        dlgForm.setLocation(200, 200);
        dlgForm.setLayout(null);
        JButton b = new JButton("按钮");
        b.setBounds(50, 50, 280, 30);
        dlgForm.add(b);
        dlgForm.setVisible(true);
    }
}

模态JDialog

当一个对话框被设置为模态的时候,其背后的父窗体,是不能被激活的,除非该对话框被关闭

package com.myth;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

public class JFrameExample3 {
    public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例3 外部窗体");
        frmMain.setSize(800, 600);
        frmMain.setLocation(100, 100);
 
        // 根据外部窗体实例化JDialog
        JDialog dlgForm = new JDialog(frmMain);
        // 设置为模态
        dlgForm.setModal(true);
 
        dlgForm.setTitle("模态的对话框");
        dlgForm.setSize(400, 300);
        dlgForm.setLocation(200, 200);
        dlgForm.setLayout(null);
        JButton btnOK = new JButton("按钮");
        btnOK.setBounds(50, 50, 280, 30);
        dlgForm.add(btnOK);
 
        frmMain.setVisible(true);
        dlgForm.setVisible(true);
    }
}

窗体大小不可变化

通过调用方法 setResizable(false); 做到窗体大小不可变化

package com.myth;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JFrameExample3 {
    public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面范例3");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        frmMain.setLayout(null);
        JButton btnOK = new JButton("按钮");
        btnOK.setBounds(50, 50, 280, 30);
 
        frmMain.add(btnOK);
        // 窗体大小不可变化
        frmMain.setResizable(false);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
       frmMain.setVisible(true);
    }
}

图形界面布局

绝对定位就是指不使用布局器,组件的位置和大小需要单独指定

package com.myth;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JFrameExample4 {
public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面布局范例4");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        // 设置布局器为null,即进行绝对定位,容器上的组件都需要指定位置和大小
        frmMain.setLayout(null);
        JButton btn1 = new JButton("按钮1");
        // 指定位置和大小 btn1.setBounds(x, y, width, height);
        btn1.setBounds(50, 50, 80, 30);
        JButton btn2 = new JButton("按钮2");
        btn2.setBounds(150, 50, 80, 30);
        JButton btn3 = new JButton("按钮3");
        btn3.setBounds(250, 50, 80, 30);
        // 没有指定位置和大小,不会出现在容器上
        JButton btn4 = new JButton("按钮4");
 
        frmMain.add(btn1);
        frmMain.add(btn2);
        frmMain.add(btn3);
        // b4没有指定位置和大小,不会出现在容器上
        frmMain.add(btn4);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

设置布局器为FlowLayout,顺序布局器
容器上的组件水平摆放
加入到容器即可,无需单独指定大小和位置 

package com.myth;

import java.awt.FlowLayout;
 
import javax.swing.JButton;
import javax.swing.JFrame;

public class JFrameExample4 {
public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面布局范例4");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        // 设置布局器为FlowLayerout
        // 容器上的组件水平摆放
        frmMain.setLayout(new FlowLayout());
 
        JButton btnA = new JButton("按钮A");
        JButton btnB = new JButton("按钮B");
        JButton btnC = new JButton("按钮C");
 
        // 加入到容器即可,无需单独指定大小和位置
        frmMain.add(btnA);
        frmMain.add(btnB);
        frmMain.add(btnC);
 
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

 设置布局器为BorderLayout
容器上的组件按照上北 下南 左西 右东 中的顺序摆放

package com.myth;

import java.awt.BorderLayout;
 
import javax.swing.JButton;
import javax.swing.JFrame;

public class JFrameExample4 {
public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面布局范例4");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        // 设置布局器为BorderLayerout
        // 容器上的组件按照上北下南左西右东中的顺序摆放
        frmMain.setLayout(new BorderLayout());
 
        JButton b1 = new JButton("1");
        JButton b2 = new JButton("2");
        JButton b3 = new JButton("3");
        JButton b4 = new JButton("4");
        JButton b5 = new JButton("5");
 
        // 加入到容器的时候,需要指定位置
        frmMain.add(b1, BorderLayout.NORTH);
        frmMain.add(b2, BorderLayout.SOUTH);
        frmMain.add(b3, BorderLayout.WEST);
        frmMain.add(b4, BorderLayout.EAST);
        frmMain.add(b5, BorderLayout.CENTER);
 
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

 GridLayout,即网格布局器

package com.myth;

import java.awt.GridLayout;
 
import javax.swing.JButton;
import javax.swing.JFrame;

public class JFrameExample4 {
 public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面布局范例4");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        // 设置布局器为GridLayerout,即网格布局器
        // 该GridLayerout的构造方法表示该网格是2行3列
        frmMain.setLayout(new GridLayout(2, 3));
 
        JButton b1 = new JButton("1");
        JButton b2 = new JButton("2");
        JButton b3 = new JButton("3");
        JButton b4 = new JButton("4");
        JButton b5 = new JButton("5");
 
        frmMain.add(b1);
        frmMain.add(b2);
        frmMain.add(b3);
        frmMain.add(b4);
        frmMain.add(b5);
 
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

 即便 使用 布局器 ,也可以 通过setPreferredSize,向布局器建议该组件显示的大小.
注 只对部分布局器起作用,比如FlowLayout可以起作用。 比如GridLayout就不起作用,因为网格布局器必须对齐

package com.myth;

import java.awt.Dimension;
import java.awt.FlowLayout;
 
import javax.swing.JButton;
import javax.swing.JFrame;

public class JFrameExample4 {
 public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面布局范例4");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        frmMain.setLayout(new FlowLayout());
 
        JButton b1 = new JButton("按钮1");
        JButton b2 = new JButton("按钮2");
        JButton b3 = new JButton("按钮3");
 
        // 即便使用布局器 ,也可以通过setPreferredSize,向布局器建议该组件显示的大小
        b3.setPreferredSize(new Dimension(180, 40));
 
        frmMain.add(b1);
        frmMain.add(b2);
        frmMain.add(b3);
 
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

package com.myth;

import java.awt.Color;
 
import javax.swing.JFrame;
import javax.swing.JLabel;

public class JFrameExample4 {
 public static void main(String[] args) {
          
        JFrame frmMain = new JFrame("图形界面范例 - 标签");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        frmMain.setLayout(null);
        JLabel lbl1 = new JLabel("用户姓名:");
        //文字颜色
        lbl1.setForeground(Color.red);
        lbl1.setBounds(50, 50, 280, 30);
  
        frmMain.add(lbl1);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
        frmMain.setVisible(true);
    }
}

JCheckBox 复选框

使用isSelected来获取是否选中了 

package com.myth;

import javax.swing.JCheckBox;
import javax.swing.JFrame;

public class JFrameExample4 {
public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面范例 - 复选框");
        frmMain.setSize(400, 300);
        frmMain.setLocation(580, 200);
        frmMain.setLayout(null);
        JCheckBox chkItem1 = new JCheckBox("启用第一项");
        //设置 为 默认被选中
        chkItem1.setSelected(true);
        chkItem1.setBounds(50, 50, 130, 30);
        JCheckBox chkItem2 = new JCheckBox("启用第二项");
        chkItem2.setBounds(50, 100, 130, 30);
        //判断 是否 被 选中
        System.out.println(chkItem2.isSelected());
 
        frmMain.add(chkItem1);
        frmMain.add(chkItem2);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

 

JRadioButton 单选框
使用isSelected来获取是否选中了

在这个例子里,两个单选框可以被同时选中,为了实现只能选中一个,还需要用到ButtonGroup

package com.myth;

import javax.swing.JFrame;
import javax.swing.JRadioButton;

public class JFrameExample4 {
    public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例 - 单选框");
        frmMain.setSize(400, 300);
        frmMain.setLocation(580, 200);
        frmMain.setLayout(null);
        JRadioButton rbt1 = new JRadioButton("第1项");
        // 设置 为 默认被选中
        rbt1.setSelected(true);
        rbt1.setBounds(50, 50, 130, 30);
        JRadioButton rbt2 = new JRadioButton("第2项");
        rbt2.setBounds(50, 100, 130, 30);
 
        System.out.println(rbt2.isSelected());
 
        frmMain.add(rbt1);
        frmMain.add(rbt2);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

 ButtonGroup 对按钮进行分组,把不同的按钮,放在同一个分组里 ,同一时间,只有一个 按钮 会被选中

package com.myth;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JRadioButton;

public class JFrameExample4 {
 public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面范例 - 按钮组");
        frmMain.setSize(400, 300);
        frmMain.setLocation(580, 240);
        frmMain.setLayout(null);
        JRadioButton b1 = new JRadioButton("按钮组第一项");
        b1.setSelected(true);
        b1.setBounds(50, 50, 130, 30);
        JRadioButton b2 = new JRadioButton("按钮组第二项");
        b2.setBounds(50, 100, 130, 30);
 
        // 按钮分组
        ButtonGroup btng = new ButtonGroup();
        // 把b1,b2放在同一个按钮分组对象里 ,这样同一时间只有一个按钮会被选中
        btng.add(b1);
        btng.add(b2);
 
        frmMain.add(b1);
        frmMain.add(b2);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

 JComboBox 下拉框
使用getSelectedItem来获取被选中项
使用setSelectedItem() 来指定要选中项

package com.myth;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class JFrameExample4 {
    public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面范例 - 下拉框");
        frmMain.setSize(400, 300);
        frmMain.setLocation(580, 240);
        frmMain.setLayout(null);
 
        //下拉框出现的条目
        String[] fruits = new String[] { "苹果", "香蕉" };
        JComboBox cmbFruits = new JComboBox(fruits);
        cmbFruits.setBounds(50, 50, 80, 30);
 
        frmMain.add(cmbFruits);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

 JOptionPane 用于弹出对话框

JOptionPane.showConfirmDialog(f, "是否 使用外挂 ?");
表示询问,第一个参数是该对话框以哪个组件对齐
JOptionPane.showInputDialog(f, "请输入yes,表明使用外挂后果自负");
接受用户的输入
JOptionPane.showMessageDialog(f, "你使用外挂被抓住! 罚拣肥皂3次!");
显示消息

package com.myth;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class JFrameExample4 {
   public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例 - 弹出对话框显示消息");
        frmMain.setSize(400, 300);
        frmMain.setLocation(580, 240);
        frmMain.setLayout(null);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setVisible(true);
 
        int option = JOptionPane.showConfirmDialog(frmMain, "您确定要这么做吗?");
        if (JOptionPane.OK_OPTION == option) {
            String answer = JOptionPane.showInputDialog(frmMain, "输入yes进入分支流程");
            if ("yes".equals(answer))
                JOptionPane.showMessageDialog(frmMain, "您已进入分支流程!");
        }
    }
}

JTextField 输入框
setText 设置文本
getText 获取文本
JTextField 是单行文本框,如果要输入多行数据,请使用JTextArea

txtPassword.grabFocus(); 表示让密码输入框获取焦点

package com.myth;
import java.awt.Dimension;
import java.awt.FlowLayout;
 
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class JFrameExample4 {
    public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例 - 文本框");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
 
        frmMain.setLayout(new FlowLayout());
        JLabel lblName = new JLabel("用户名称:");
        // 输入框
        JTextField txtName = new JTextField("");
        txtName.setText("请输入账号");
        txtName.setPreferredSize(new Dimension(80, 30));
 
        JLabel lblPassword = new JLabel("用户密码:");
        // 输入框
        JTextField txtPassword = new JTextField("");
        txtPassword.setText("请输入密码");
        txtPassword.setPreferredSize(new Dimension(80, 30));
        frmMain.add(lblName);
        frmMain.add(txtName);
        frmMain.add(lblPassword);
        frmMain.add(txtPassword);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
        txtPassword.grabFocus();
    }
}

JPasswordField 密码框
与文本框不同,获取密码框里的内容,推荐使用getPassword,该方法会返回一个字符数组,而非字符串

package com.myth;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;

public class JFrameExample4 {
    public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例 - 密码框");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
 
        frmMain.setLayout(new FlowLayout());
        JLabel lblPassword = new JLabel("密码:");
        // 密码框
        JPasswordField txtPassword = new JPasswordField("");
        txtPassword.setText("123456");
        txtPassword.setPreferredSize(new Dimension(80, 30));
 
        // 与文本框不同,获取密码框里的内容,推荐使用getPassword,该方法会返回一个字符数组,而非字符串
        char[] charPass = txtPassword.getPassword();
        String pass = String.valueOf(charPass);
        System.out.println(pass);
        frmMain.add(lblPassword);
        frmMain.add(txtPassword);
 
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

 JTextArea:文本域。
和文本框JTextField不同的是,文本域可以输入多行数据
如果要给文本域初始文本,通过\n来实现换行效果
JTextArea通常会用到append来进行数据追加
如果文本太长,会跑出去,可以通过setLineWrap(true) 来做到自动换行

package com.myth;
import java.awt.Dimension;
import java.awt.FlowLayout;
  
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;

public class JFrameExample4 {
 public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例 - 文本域");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        frmMain.setLayout(new FlowLayout());
        
  
        JTextArea txtAreaContent = new JTextArea();
        txtAreaContent.setPreferredSize(new Dimension(300, 150));
        //\n换行符
        txtAreaContent.setText("默认行\n");
        //追加数据
        txtAreaContent.append("追加行\n");
        //设置自动换行
        txtAreaContent.setLineWrap(true);
        frmMain.add(lblSubject);
        frmMain.add(txtAreaContent);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
        frmMain.setVisible(true);
    }
}

package com.myth;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class JFrameExample4 {
public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例 - 进度条");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
 
        frmMain.setLayout(new FlowLayout());
        JProgressBar progressBar = new JProgressBar();
 
        //进度条最大100
        progressBar.setMaximum(100);
        //当前进度是50
        progressBar.setValue(50);
        //显示当前进度
        progressBar.setStringPainted(true);
        frmMain.add(progressBar);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setVisible(true);
    }
}

 JFileChooser 表示文件选择器
使用FileFilter用于仅选择文件类型

package com.myth;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
  
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;

public class JFrameExample4 {
 public static void main(String[] args) {
  
        JFrame frmMain = new JFrame("图形界面范例 - 文件选择器");
        frmMain.setLayout(new FlowLayout());
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new FileFilter() {
            @Override
            public String getDescription() {
                // TODO Auto-generated method stub
                return ".txt";
            }
             
            @Override
            public boolean accept(File file) {
                return file.getName().toLowerCase().endsWith(".txt");
            }
        });
  
        JButton btnOpen = new JButton("打开文件");
        JButton btnSave = new JButton("保存文件");
  
        frmMain.add(btnOpen);
        frmMain.add(btnSave);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setSize(400, 300);
        frmMain.setLocationRelativeTo(null);
        frmMain.setVisible(true);
          
        btnOpen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                 int returnVal =  fileChooser.showOpenDialog(frmMain);
                 File file = fileChooser.getSelectedFile();
                 if (returnVal == JFileChooser.APPROVE_OPTION) {
                     JOptionPane.showMessageDialog(frmMain, "计划打开文件:" + file.getAbsolutePath());
                 }
            }
        });
        btnSave.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int returnVal =  fileChooser.showSaveDialog(frmMain);
                File file = fileChooser.getSelectedFile();
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    JOptionPane.showMessageDialog(frmMain, "计划保存到文件:" + file.getAbsolutePath());
                }
            }
        });
  
    }
}

 JPanel即为基本面板
面板和JFrame一样都是容器,不过面板一般用来充当中间容器,把组件放在面板上,然后再把面板放在窗体上
一旦移动一个面板,其上面的组件,就会全部统一跟着移动,采用这种方式,便于进行整体界面的设计

package com.myth;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JFrameExample4 {
     public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面范例 - 基本面板");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
 
        frmMain.setLayout(null);
 
        JPanel p1 = new JPanel();
        // 设置面板大小
        p1.setBounds(50, 50, 300, 60);
        // 设置面板背景颜色
        p1.setBackground(Color.RED);
 
        // 这一句可以没有,因为JPanel默认就是采用的FlowLayout
        p1.setLayout(new FlowLayout());
 
        JButton b1 = new JButton("按钮1");
        JButton b2 = new JButton("按钮2");
        JButton b3 = new JButton("按钮3");
 
        // 把按钮加入面板
        p1.add(b1);
        p1.add(b2);
        p1.add(b3);
        JPanel p2 = new JPanel();
        JButton b4 = new JButton("按钮4");
        JButton b5 = new JButton("按钮5");
        JButton b6 = new JButton("按钮6");
 
        p2.add(b4);
        p2.add(b5);
        p2.add(b6);
        p2.setBackground(Color.BLUE);
        p2.setBounds(10, 150, 300, 60);
        // 把面板加入窗口
        frmMain.add(p1);
        frmMain.add(p2);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

JFrame上有一层面板,叫做ContentPane
平时通过frmMain.add()向JFrame增加组件,其实是向JFrame上的 ContentPane加东西

package com.myth;
import javax.swing.JButton;
import javax.swing.JFrame;

public class JFrameExample4 {
        public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面范例 - JFrame上集成的默认面板ContentPane");
        frmMain.setSize(600, 300);
        frmMain.setLocation(200, 200);
        frmMain.setLayout(null);
        JButton btnOK = new JButton("按钮");
        btnOK.setBounds(50, 50, 280, 30);
 
        frmMain.add(btnOK);
        // JFrame上有一层面板,叫做ContentPane
        // 平时通过frmMain.add()向JFrame增加组件,其实是向JFrame上的 ContentPane加东西
        // frmMain.add等同于frmMain.getContentPane().add(btnOK);
        frmMain.getContentPane().add(btnOK);
 
        // btnOK.getParent()获取按钮btnOK所处于的容器
        // 打印出来可以看到,实际上是ContentPane而非JFrame
        System.out.println(btnOK.getParent());
 
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frmMain.setVisible(true);
    }
}

 

创建一个水平JSplitPane,左边是pLeft,右边是pRight

package com.myth;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;

public class JFrameExample4 {
public static void main(String[] args) {
  
        JFrame frmMain = new JFrame("图形界面范例 - JSplitPane面板");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        frmMain.setLayout(null);
  
        JPanel pLeft = new JPanel();
        pLeft.setBounds(50, 50, 300, 60);
        pLeft.setBackground(Color.RED);
        pLeft.setLayout(new FlowLayout());
  
        JButton b1 = new JButton("按钮1");
        JButton b2 = new JButton("按钮2");
        JButton b3 = new JButton("按钮3");
  
        pLeft.add(b1);
        pLeft.add(b2);
        pLeft.add(b3);
  
        JPanel pRight = new JPanel();
        JButton b4 = new JButton("按钮4");
        JButton b5 = new JButton("按钮5");
        JButton b6 = new JButton("按钮6");
  
        pRight.add(b4);
        pRight.add(b5);
        pRight.add(b6);
  
        pRight.setBackground(Color.BLUE);
        pRight.setBounds(10, 150, 300, 60);
        // 创建一个水平JSplitPane,左边是p1,右边是p2
        JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pLeft, pRight);
        // 设置分割条的位置
        sp.setDividerLocation(80);
  
        // 把sp当作ContentPane
        frmMain.setContentPane(sp);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setVisible(true);
    }
}

使用带滚动条的面板有两种方式
1. 在创建JScrollPane,把组件作为参数传进去

JScrollPane sp = new JScrollPane(ta);
2. 希望带滚动条的面板显示其他组件的时候,调用setViewportView

sp.setViewportView(ta);

package com.myth;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JFrameExample4 {
public static void main(String[] args) {
 
        JFrame frmMain = new JFrame("图形界面范例 - 带滚动条的面板");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
 
        frmMain.setLayout(null);
        //准备一个文本域,在里面放很多数据
        JTextArea ta = new JTextArea();
        for (int i = 0; i < 1000; i++) {
            ta.append(String.valueOf(i));
        }
        //自动换行
        ta.setLineWrap(true);
        JScrollPane sp = new JScrollPane(ta);
 
        frmMain.setContentPane(sp);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setVisible(true);
    }
}
package com.myth;
import java.awt.Color;
import java.awt.FlowLayout;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class JFrameExample4 {
public static void main(String[] args) {
  
        JFrame frmMain = new JFrame("图形界面范例 - TabbedPanel面板");
        frmMain.setSize(400, 300);
        frmMain.setLocation(200, 200);
        frmMain.setLayout(null);
  
        JPanel p1 = new JPanel();
        p1.setBounds(50, 50, 300, 60);
        p1.setBackground(Color.RED);
        p1.setLayout(new FlowLayout());
  
        JButton b1 = new JButton("按钮1");
        JButton b2 = new JButton("按钮2");
        JButton b3 = new JButton("按钮3");
  
        p1.add(b1);
        p1.add(b2);
        p1.add(b3);
  
        JPanel p2 = new JPanel();
        JButton b4 = new JButton("按钮4");
        JButton b5 = new JButton("按钮5");
        JButton b6 = new JButton("按钮6");
  
        p2.add(b4);
        p2.add(b5);
        p2.add(b6);
  
        p2.setBackground(Color.BLUE);
        p2.setBounds(10, 150, 300, 60);
  
        JTabbedPane tp = new JTabbedPane();
        tp.add(p1);
        tp.add(p2);
  
        // 设置tab的标题
        tp.setTitleAt(0, "红色tab");
        tp.setTitleAt(1, "蓝色tab");
         
        //图片路径从包开始写而绝对路径是无法显示的
        //String path = "com/myth/2.png";  
        //ImageIcon pic = new ImageIcon(ClassLoader.getSystemResource(path));
        //tp.setIconAt(0,pic);
        //tp.setIconAt(1,pic);
  
        frmMain.setContentPane(tp);
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setVisible(true);
    }
}

 CardLayerout 布局器 很像TabbedPanel ,在本例里面上面是一个下拉框,下面是一个CardLayerout 的JPanel
这个JPanel里有两个面板,可以通过CardLayerout方便的切换

package com.myth;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class JFrameExample4 {
public static void main(String[] args) {
        JFrame frmMain = new JFrame("图形界面范例 - CardLayerout布局器");
        JPanel comboBoxPane = new JPanel();
        String buttonPanel = "按钮面板";
        String inputPanel = "输入框面板";
        String items[] = { buttonPanel, inputPanel };
        JComboBox<String> comboBox = new JComboBox<>(items);
        comboBoxPane.add(comboBox);
 
        // 两个Panel充当卡片
        JPanel p1 = new JPanel();
        p1.add(new JButton("按钮 1"));
        p1.add(new JButton("按钮 2"));
        p1.add(new JButton("按钮 3"));
 
        JPanel p2 = new JPanel();
        p2.add(new JTextField("输入框", 20));
 
        JPanel p; // a panel that uses CardLayout
        p = new JPanel(new CardLayout());
        p.add(p1, buttonPanel);
        p.add(p2, inputPanel);
 
        frmMain.add(comboBoxPane, BorderLayout.NORTH);
        frmMain.add(p, BorderLayout.CENTER);
 
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setSize(400, 300);
        frmMain.setLocationRelativeTo(null);
        frmMain.setVisible(true);
 
        comboBox.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                CardLayout cardLayout = (CardLayout) (p.getLayout());
                cardLayout.show(p, (String) e.getItem());
            }
        });    
    }
}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myth;
import java.awt.*;
import javax.swing.*;

public class MSCommDemo  {

    public static void main(String[] agrs) {
         // 主窗体
        JFrame frmMain = new JFrame("图形界面 - 串口通讯范例1");
        // 主窗体设置大小
        frmMain.setSize(1100, 560);
        // 主窗体设置位置
        frmMain.setLocation(200, 200);

        String[] port = {"COM1", "COM2", "CO3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9"};
        String[] baud = {"2400", "4800", "9600", "115200", "384000"};
        String[] data = {"6", "7", "8"};
        String[] xor = {"0", "1", "2"};
        String[] stop = {"0", "1", "1.5", "2"};

        //定义标签
        JLabel lblPort = new JLabel("端口号:");
        JLabel lblBaud = new JLabel("波特率:");
        JLabel lblData = new JLabel("数据位:");
        JLabel lblXor = new JLabel("校验位:");
        JLabel lblStop = new JLabel("停止位:");

        lblPort.setHorizontalAlignment(SwingConstants.RIGHT);
        lblBaud.setHorizontalAlignment(SwingConstants.RIGHT);
        lblData.setHorizontalAlignment(SwingConstants.RIGHT);
        lblXor.setHorizontalAlignment(SwingConstants.RIGHT);
        lblStop.setHorizontalAlignment(SwingConstants.RIGHT);

        //定义下拉列表框
        JComboBox cmbPort = new JComboBox(port);
        JComboBox cmbBaud = new JComboBox(baud);
        JComboBox cmbData = new JComboBox(data);
        JComboBox cmbXor = new JComboBox(xor);
        JComboBox cmbStop = new JComboBox(stop);

        //定义面板
        //将北部面板定义为网格布局为1行1列
        JPanel north = new JPanel();
        north.setLayout(new GridLayout(1, 1));
        
        //将定义左边的面板为网格布局为3行2列
        JPanel left = new JPanel();
        left.setOpaque(false);
        left.setLayout(new GridLayout(3, 2));
        //定义流布局1 FlowLayout.LEFT ——组件的左对齐方式组件的水平间距为10像素,垂直间距为5像素
        JPanel leftPane1 = new JPanel();
        leftPane1.setBackground(Color.RED);
        leftPane1.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5));
        leftPane1.add(lblPort);
        leftPane1.add(cmbPort);

        //定义流布局2
        JPanel leftPane2 = new JPanel();
        leftPane2.setBackground(Color.GREEN);
        leftPane2.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5));
        leftPane2.add(lblBaud);
        leftPane2.add(cmbBaud);

        //定义流布局3
        JPanel leftPane3 = new JPanel();
        leftPane3.setBackground(Color.YELLOW);
        leftPane3.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5));
        leftPane3.add(lblData);
        leftPane3.add(cmbData);

        //将3个流布局的面板,添加到3*2网格布局面板上
        left.add(leftPane1);
        left.add(leftPane2);
        left.add(leftPane3);

        //定义右边的面板为网格布局为3行2列
        JPanel right = new JPanel();
        right.setBackground(Color.YELLOW);
        right.setOpaque(false);
        right.setLayout(new GridLayout(3, 2));

        //定义流布局1
        JPanel rightPane1 = new JPanel();
        rightPane1.setBackground(Color.YELLOW);
        rightPane1.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        rightPane1.add(lblXor);
        rightPane1.add(cmbXor);

        //定义流布2
        JPanel rightPane2 = new JPanel();
        rightPane2.setBackground(Color.RED);
        rightPane2.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        rightPane2.add(lblStop);
        rightPane2.add(cmbStop);

        //定义流布局3
        JPanel rightPane3 = new JPanel();
        rightPane3.setBackground(Color.GREEN);
        rightPane2.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        JButton btnOpen = new JButton("打开端口");
        JButton btnClose = new JButton("关闭端口");
        rightPane3.add(btnOpen);
        rightPane3.add(btnClose);

        //添加三个流布局面板到3*2网络面板上
        right.add(rightPane1);
        right.add(rightPane2);
        right.add(rightPane3);
        //将左右面板添加到北边的面板上
        north.add(left);
        north.add(right);

        //设置中间面板各组件
        JPanel center = new JPanel();
        center.setOpaque(false);
        center.setLayout(new GridLayout(2, 2));
        
        //定义流布局面板1
        JPanel centerPane1 = new JPanel();
        centerPane1.setBackground(Color.PINK);
        centerPane1.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5));
        JTextField txtSend = new JTextField(90);
        JLabel lblSend = new JLabel("发送数据:");
        centerPane1.add(lblSend);
        centerPane1.add(txtSend);

        //定义流布局面板2
        JPanel centerPane2 = new JPanel();
        centerPane2.setBackground(Color.ORANGE);
        centerPane2.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 5));
        //创建一个20行90列的文本区域
        JTextArea txaRevied = new JTextArea(10,90);
        txaRevied.setLineWrap(true);	//设置多行文本框自动换行
        //txaRevied.setEditable(false);
        txaRevied.setBackground(new Color(255, 255, 255));
        JScrollPane scrollPane = new JScrollPane(txaRevied); 
        JLabel lblRevied = new JLabel("接收数据:");
        centerPane2.add(lblRevied);
        centerPane2.add(scrollPane);
        center.add(centerPane1);
        center.add(centerPane2);

        //底部布局
        JPanel south = new JPanel();
        south.setLayout(new GridLayout(1, 2));
        south.setOpaque(false);
        //底部流布局
        JPanel southPane = new JPanel();
        southPane.setBackground(Color.CYAN);
        southPane.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
        JButton btnOK = new JButton("确认");
        JButton btnExit = new JButton("退出");
        southPane.add(btnOK);
        southPane.add(btnExit);
        south.add(southPane);

        frmMain.setLayout(new BorderLayout());
        frmMain.add(north, BorderLayout.NORTH);
        frmMain.add(center, BorderLayout.CENTER);
        frmMain.add(south, BorderLayout.SOUTH);

        // 关闭窗体的时候,退出程序
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 让窗体变得可见
        frmMain.setVisible(true);

    }

}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值