Java 图形化界面编程(Swing)入门实例

本文目录


入门实例

  • 先整一个图形化界面出来
package swing;

import javax.swing.*;

public class Demo {

    public static void main(String[] args) {

        // 2. 创建中间容器(面板容器)
        JPanel panel = new JPanel();                // 创建面板容器,使用默认的布局管理器

        // 3. 创建一个基本组件(按钮),并添加到 面板容器 中
        JButton btn = new JButton("测试按钮");
        panel.add(btn);

        // 5. 显示窗口,前面创建的信息都在内存中,通过 jf.setVisible(true) 把内存中的窗口显示在屏幕上。
        // 1. 创建一个顶层容器(窗口)
        JFrame jf = new JFrame("测试窗口");          // 创建窗口

        jf.setContentPane(panel);// 4. 把 面板容器 作为窗口的内容面板 设置到 窗口
        jf.setSize(250, 250);                       // 设置窗口大小
        jf.setLocationRelativeTo(null);             // 把窗口位置设置到屏幕中心
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 当点击窗口的关闭按钮时退出程序(没有这一句,程序不会退出)
        jf.setVisible(true);
    }

}

常用布局

流式布局

package swing;

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

public class Main {

    public static void main(String[] args) {


        // 创建内容面板,指定使用 流式布局
        JPanel panel = new JPanel(new FlowLayout());

        JButton btn01 = new JButton("按钮01");
        JButton btn02 = new JButton("按钮02");
        JButton btn03 = new JButton("按钮03");
        JButton btn04 = new JButton("按钮04");
        JButton btn05 = new JButton("按钮05");

        panel.add(btn01);
        panel.add(btn02);
        panel.add(btn03);
        panel.add(btn04);
        panel.add(btn05);

        JFrame jf = new JFrame("测试窗口");
        jf.setContentPane(panel);
        jf.setSize(200, 250);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);        // PS: 最后再设置为可显示(绘制), 所有添加的组件才会显示
    }
}

网格布局

package swing;

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

public class Main {

    public static void main(String[] args) {


        // 创建 3 行 3 列 的网格布局
        GridLayout layout = new GridLayout(3, 3);

        // 设置 水平 和 竖直 间隙
        // layout.setHgap(10);
        // layout.setVgap(10);

        JPanel panel = new JPanel(layout);

        JButton btn01 = new JButton("按钮01");
        JButton btn02 = new JButton("按钮02");
        JButton btn03 = new JButton("按钮03");
        JButton btn04 = new JButton("按钮04");
        JButton btn05 = new JButton("按钮05");
        JButton btn06 = new JButton("按钮06");
        JButton btn07 = new JButton("按钮07");
        JButton btn08 = new JButton("按钮08");

        panel.add(btn01);
        panel.add(btn02);
        panel.add(btn03);
        panel.add(btn04);
        panel.add(btn05);
        panel.add(btn06);
        panel.add(btn07);
        panel.add(btn08);

        JFrame jf = new JFrame("测试窗口");

        jf.setContentPane(panel);
        jf.setSize(200, 250);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }
}

边界布局

package swing;

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

public class Main {

    public static void main(String[] args) {


        // 创建内容面包容器,指定使用 边界布局
        JPanel panel = new JPanel(new BorderLayout());

        // 创建 5 个按钮
        JButton btnN = new JButton("Button_North");
        JButton btnS = new JButton("Button_South");
        JButton btnW = new JButton("Button_West");
        JButton btnE = new JButton("Button_East");
        JButton btnC = new JButton("Button_Center");

        // 把 5 个按钮添加到容器中的 5 个方位
        panel.add(btnN, BorderLayout.NORTH);
        panel.add(btnS, BorderLayout.SOUTH);
        panel.add(btnW, BorderLayout.WEST);
        panel.add(btnE, BorderLayout.EAST);
        panel.add(btnC, BorderLayout.CENTER);

        JFrame jf = new JFrame("测试窗口");
        jf.setSize(350, 250);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setContentPane(panel);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }
}

实例1:

  • 编写拥有垂直Box (boxl)和水平Box (box2) 两类Box的BoxLayout.
    在这里插入图片描述
  • 具体代码实现
package layoutDemo;

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

public class BoxLayoutDemo {

    public static void main(String[] args) {

        JButton btn01 = new JButton("Button01");
        JButton btn02 = new JButton("Button02");
        JButton btn03 = new JButton("Button03");
        JButton btn04 = new JButton("Button04");
        JButton btn05 = new JButton("Button05");

        // 创建一个垂直箱容器,放置上面两个水平箱(Box组合嵌套)
        Box vBox = Box.createVerticalBox();
        vBox.add(Box.createRigidArea(new Dimension(300,0)));//Dimension类只是用来封装单个对象中组件的宽度和高度,此处表示jb1上方的距离
        vBox.add(btn04);
        vBox.add(Box.createVerticalStrut(20));//添加高度为20的垂直支架,也就是jb1和jb2之间的距离
        vBox.add(btn05);

        // 创建第一个水平箱容器
        Box hBox = Box.createHorizontalBox();
        hBox.add(btn01);
        hBox.add(Box.createHorizontalStrut(20));
        hBox.add(btn02);

        hBox.add(Box.createHorizontalGlue()); // 添加一个水平方向胶状的不可见组件,撑满剩余水平空间
        hBox.add(Box.createHorizontalStrut(20));

        hBox.add(btn03);

        vBox.add(Box.createVerticalStrut(100));
        vBox.add(hBox);

        JFrame jf = new JFrame("测试窗口");
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setContentPane(vBox);
        jf.setSize(400, 300);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }

}

实例2:

  • 编写拥有顶层容器Container和中间容器Jpane的CardLayout.要求给jbn按钮注册监听器,点击jbn按钮时可切换容器中的下一张卡片(共设置六张卡片)。
    在这里插入图片描述
  • 具体代码实现
package layoutDemo;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;


public class CardLayoutDemo extends JFrame {
    private JPanel cardPanel = null; // 主要的JPanel,该JPanel的布局管理将被设置成CardLayout
    private JPanel controlPanel = null; // 放按钮的JPanel
    private CardLayout card = null; // CardLayout布局管理器
    private JButton btnNext = null; // 下一步
    private JPanel p_1 = null, p_2 = null, p_3 = null,p_4 = null, p_5 = null, p_6 = null; // 要切换的三个JPanel

    public CardLayoutDemo() {
        super("CardLayoutDemo 窗口");
        try {
            // 将LookAndFeel设置成Windows样式
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        /**创建一个具有指定的水平和垂直间隙的新卡片布局*/
        card = new CardLayout(5, 5);
        cardPanel = new JPanel(card); // JPanel的布局管理将被设置成CardLayout
        controlPanel = new JPanel(); // 构造放按钮的JPanel
        btnNext = new JButton("下一张 >");
        controlPanel.add(btnNext);
        p_1 = new JPanel();
        p_2 = new JPanel();
        p_3 = new JPanel();
        p_4 = new JPanel();
        p_5 = new JPanel();
        p_6 = new JPanel();

        p_1.setBackground(Color.GREEN);
        p_2.setBackground(Color.MAGENTA);
        p_3.setBackground(Color.WHITE);
        p_4.setBackground(Color.PINK);
        p_5.setBackground(Color.CYAN);
        p_6.setBackground(Color.ORANGE);

        p_1.add(new JLabel("第一页"));
        p_2.add(new JLabel("第二页"));
        p_3.add(new JLabel("第三页"));
        p_4.add(new JLabel("第四页"));
        p_5.add(new JLabel("第五页"));
        p_6.add(new JLabel("第六页"));
        cardPanel.add(p_1, "p1");
        cardPanel.add(p_2, "p2");
        cardPanel.add(p_3, "p3");
        cardPanel.add(p_4, "p1");
        cardPanel.add(p_5, "p2");
        cardPanel.add(p_6, "p3");
        /**下面是翻转到卡片布局的某个组件,可参考API中的文档*/
        btnNext.addActionListener(new ActionListener(){ // 下一步的按钮动作
            public void actionPerformed(ActionEvent e) {
                card.next(cardPanel);
            }
        });

        this.getContentPane().add(cardPanel);
        this.getContentPane().add(controlPanel, BorderLayout.SOUTH);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(300, 200);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new CardLayoutDemo();
    }

}

实例3:

  • 编写2行,4列,行间距为40,列间距为40的GridLayout。要求初始化七个Button。
  • 设置窗体出现在屏幕中央
    在这里插入图片描述
  • 具体代码实现
package layoutDemo;

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

public class GridLayoutDemo {

    public static void main(String[] args) {


        // 创建 3 行 3 列 的网格布局
        GridLayout layout = new GridLayout(2, 4);

        // 设置 水平 和 竖直 间隙
         layout.setHgap(40);
         layout.setVgap(40);

        JPanel panel = new JPanel(layout);

        JButton btn01 = new JButton("按钮01");
        JButton btn02 = new JButton("按钮02");
        JButton btn03 = new JButton("按钮03");
        JButton btn04 = new JButton("按钮04");
        JButton btn05 = new JButton("按钮05");
        JButton btn06 = new JButton("按钮06");
        JButton btn07 = new JButton("按钮07");
//        JButton btn08 = new JButton("按钮08");

        panel.add(btn01);
        panel.add(btn02);
        panel.add(btn03);
        panel.add(btn04);
        panel.add(btn05);
        panel.add(btn06);
        panel.add(btn07);
//        panel.add(btn08);

        JFrame jf = new JFrame("GridLayoutDemo窗口");

        jf.setContentPane(panel);
        jf.setSize(600, 500);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }
}

实例4:

要求:
  • 字符串大小写转换:创建一个Jframe,里面包含1个TextField, 1个TextArea, 1个Button。
  • 给Button添加ActionListener监听器,实现按钮点击。
  • 在TextField中输入英文字符串,点击button后,将字符串中的大小写字符互换,显示在TextArea中。
    在这里插入图片描述
具体代码实现
package cust.aowei;

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class SwingLinsterDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingLinster swingLinster = new SwingLinster();
	}

}
class SwingLinster {

	public SwingLinster(){
	
        JPanel panel = new JPanel();                // 创建面板容器,使用默认的布局管理器
        final JTextField textField = new JTextField(8);
        final JTextField result = new JTextField(8);
        result.setFont(new Font(null, Font.PLAIN, 20));
        textField.setFont(new Font(null, Font.PLAIN, 20));
        panel.add(textField);
        panel.add(result);
        
        // 创建一个按钮,点击后获取文本框中的文本
        JButton btn = new JButton("提交");
        btn.setFont(new Font(null, Font.PLAIN, 20));
        panel.add(btn);
        
        // 5. 显示窗口,前面创建的信息都在内存中,通过 jf.setVisible(true) 把内存中的窗口显示在屏幕上。
        // 1. 创建一个顶层容器(窗口)
        JFrame jf = new JFrame("测试窗口");          // 创建窗口
        jf.setContentPane(panel);// 4. 把 面板容器 作为窗口的内容面板 设置到 窗口
        jf.setSize(400, 250);                       // 设置窗口大小
        jf.setLocationRelativeTo(null);             // 把窗口位置设置到屏幕中心
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 当点击窗口的关闭按钮时退出程序(没有这一句,程序不会退出)
        jf.setVisible(true);
        
        //监听按钮
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("提交: " + textField.getText());
                result.setText(Transformation(textField.getText()));
            }
        });
        
	}
	public String Transformation(String a){
		System.out.println("Transformation");
		char []tmp = a.toCharArray();
		for(int i = 0; i<a.length();i++){
			char t = tmp[i];
			System.out.println("for");
			
			if(t<= 90 && t>= 65){
				tmp[i]= Character.toLowerCase(t);
				System.out.println("转换为小写"+t);
			}else if(t<= 122 && t>= 97){
				tmp[i]= Character.toUpperCase(t);
				System.out.println("转换为大写"+t);
			}
		}
		System.out.print("转换后:"+String.valueOf(tmp));
		return String.valueOf(tmp);
	}
}

单词计数

要求:
  • 在textField(上)中填入输入文件路径(文件自己创建)点击button (上)后(判断是否存在),
  • 如果存在该路径,读取该文件内容,统计单词数量,以(单词,数量)的形式展示在textArea中。
  • 在textField(下)中填入输出文件路径,点击button(下)
  • 如果存在textField(下)中的文件则删除后创建,将textArea中的内容存入该文件
实现效果
  • 在项目根目录下新建aaa.txt
  • 添加内容
    在这里插入图片描述
  • 在对应文本框中输入文件名,点击读取
  • 读取的内容将按照特定格式显示在文本域中
    在这里插入图片描述
  • 在对应文本框中输入文件名,点击写入
  • 文本域中内容将被写入文件中
    在这里插入图片描述
具体代码实现
package cust.aowei.swingFile;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;


public class SwingFileDemo {
	public static void main(String[] args){
		SwingFile swingfile = new SwingFile();
	}

}


class SwingFile {
	private String fileContent;
	private JTextArea textArea;
	public SwingFile(){
	
        JPanel panel = new JPanel();                // 创建面板容器,使用默认的布局管理器
        final JTextField textFieldTop = new JTextField(8);
        final JTextField textFieldLow = new JTextField(8);
        textFieldTop.setFont(new Font(null, Font.PLAIN, 20));
        textFieldLow.setFont(new Font(null, Font.PLAIN, 20));
        panel.add(textFieldTop);
        
        // 创建一个按钮,点击后获取文本框中的文本
        JButton btnTop = new JButton("读取");
        btnTop.setFont(new Font(null, Font.PLAIN, 20));
        panel.add(btnTop);
        
        panel.add(textFieldLow);
        JButton btnLow = new JButton("写入");
        btnLow.setFont(new Font(null, Font.PLAIN, 20));
        panel.add(btnLow);
        
        textArea = new JTextArea(50,20);
        panel.add(textArea);
        
        // 5. 显示窗口,前面创建的信息都在内存中,通过 jf.setVisible(true) 把内存中的窗口显示在屏幕上。
        // 1. 创建一个顶层容器(窗口)
        JFrame jf = new JFrame("测试窗口");          // 创建窗口
        jf.setContentPane(panel);// 4. 把 面板容器 作为窗口的内容面板 设置到 窗口
        jf.setSize(300, 500);                       // 设置窗口大小
        jf.setLocationRelativeTo(null);             // 把窗口位置设置到屏幕中心
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 当点击窗口的关闭按钮时退出程序(没有这一句,程序不会退出)
        jf.setVisible(true);
        
        //监听按钮
        btnTop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                	fileRead(textFieldTop.getText());
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
            }
        });
        btnLow.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
					fileWrite(textFieldLow.getText());
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
            }
        });
	}
	public void fileRead(String fileName) throws Exception{
		File f = new File(fileName);
		FileInputStream fip = new FileInputStream(f);
        // 构建FileInputStream对象
 
        InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
        // 构建InputStreamReader对象,编码与写入相同
 
        StringBuffer sb = new StringBuffer();
        while (reader.ready()) {
            sb.append((char) reader.read());
            // 转成char加到StringBuffer对象中
        }
        String content = sb.toString();
        countWords(content);
        textArea.setText(fileContent);
        reader.close();
        // 关闭读取流
 
        fip.close();
        // 关闭输入流,释放系统资源
	}
	public void fileWrite(String fileName) throws Exception{
		File f = new File(fileName);
        FileOutputStream fop = new FileOutputStream(f);
        // 构建FileOutputStream对象,文件不存在会自动新建
 
        OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
        // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
 
        writer.append(fileContent);
 
        writer.close();
        // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
 
        fop.close();
        // 关闭输出流,释放系统资源
       
        textArea.setText("写入成功");
	}
	public void countWords(String str){

        Map<String, Integer> map=new HashMap<String, Integer>();        
        Pattern p=Pattern.compile("\\b[a-zA-Z-]+\\b");//正则表达式
        Matcher m=p.matcher(str);
        while(m.find()){
            String mstr=m.group();
            if(map.containsKey(mstr)){
                map.put(mstr,map.get(mstr)+1);
            }else{
                map.put(mstr, 1);
            }
        }
        Set<Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Entry<String,Integer>> it=entrySet.iterator();
        StringBuffer sBuffer = new StringBuffer();
        sBuffer.append("单词	数量"+"\r\n");
        while(it.hasNext()){
            Entry<String, Integer> next = it.next();
            System.out.println(next.getKey()+" "+next.getValue());
            sBuffer.append(next.getKey()+"	 "+next.getValue()+"\r\n");
        }
        fileContent = sBuffer.toString();
    }

}

参考:
https://blog.csdn.net/xietansheng/article/details/72814492
https://www.jb51.net/article/122698.htm


Java (Swing)文件版学生信息管理系统(JTable实现)

在这里插入图片描述

发布了117 篇原创文章 · 获赞 222 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43901693/article/details/103192186