Java 图形化界面编程(Swing)入门实例
入门package swing;import javax.swing.*;public class Demo {public static void main(String[] args) {// 2. 创建中间容器(面板容器)JPanel panel = new JPanel();// 创建面板容器,使用...
·
本文目录
- 入门实例
- 先整一个图形化界面出来
- 常用布局
- 流式布局
- 网格布局
- 边界布局
- 边界布局
- 四个入门实例(附截图)
- 一个小demo(单词计数)
- 一个较为完整的demo
- Java (Swing)文件版学生信息管理系统(JTable实现)
入门实例
- 先整一个图形化界面出来
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实现)
更多推荐
已为社区贡献2条内容
所有评论(0)