JavaGUI编程
GUI:Graphical User Interface,图形用户界面
一个界面的相关组件
-
窗口
-
弹窗
-
面板
-
文本框
-
列表框
-
按钮
-
图片
-
监听事件
-
鼠标事件
简介
GUI核心技术:Swing AWT
-
界面并不美观
-
需要jre环境
为什么要学习GUI
-
可以写出自己想要的的小工具
-
工作的时候可能需要维护到Swing界面
-
作为MVC结构的铺垫,了解MVC架构,了解监听器
AWT
概述
-
AWT:abstract window toolkit,抽象窗口工具,包含很多类和接
-
元素:窗口、按钮、文本框
-
java.awt
-
内部组成:

组件与容器
窗口Frame
显示器坐标系左上角为0,0点向右为x,向下为y,两者均非负
示例:
package com.test.GUITest; import java.awt.*; //第一个界面 public class TestFrame { public static void main(String[] args) { Frame frame = new Frame("这是窗口标题"); //需要设置可见性 frame.setVisible(true); //设置窗口大小 frame.setSize(400,400); //设置背景颜色 Color类 frame.setBackground(new Color(25, 123, 217)); //弹出的初始位置 frame.setLocation(300,300); //设置大小固定 默认为true可调 frame.setResizable(true); } }
执行结果:

该处存在一个问题:生成的界面无法关闭
一次弹出多个窗口:
package com.test.GUITest; import java.awt.*; public class TestFrame2 { public static void main(String[] args) { MyFrame myFrame1 = new MyFrame(100, 100, 400, 400, Color.BLUE); MyFrame myFrame2 = new MyFrame(100, 500, 400, 400, Color.BLACK); MyFrame myFrame3 = new MyFrame(500, 100, 400, 400, Color.GREEN); MyFrame myFrame4 = new MyFrame(500, 500, 400, 400, 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);//设置可见性 //该方法四个参数分别为屏幕横向坐标,屏幕纵向坐标,宽度,高度 setBounds(x,y,w,h);//设置初始位置及窗口大小 设置初始位置和窗口大小可以用一个方法解决 setBackground(color);//设置背景颜色 } }
执行结果:

调整参数
package com.test.GUITest; import java.awt.*; public class TestFrame2 { public static void main(String[] args) { MyFrame myFrame1 = new MyFrame(300, 100, 200, 400, Color.BLUE); MyFrame myFrame2 = new MyFrame(100, 500, 400, 200, Color.BLACK); MyFrame myFrame3 = new MyFrame(500, 300, 400, 200, Color.GREEN); MyFrame myFrame4 = new MyFrame(500, 500, 200, 400, 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);//设置可见性 //该方法四个参数分别为屏幕横向坐标,屏幕纵向坐标,宽度,高度 setBounds(x,y,w,h);//设置初始位置及窗口大小 设置初始位置和窗口大小可以用一个方法解决 setBackground(color);//设置背景颜色 } }
执行结果:

面板Panel
Panel无法单独显示,必须添加到某个容器当中
实例化Panel时可以指定布局
示例:
package com.test.GUITest; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestPanel { public static void main(String[] args) { Frame frame = new Frame(); Panel panel = new Panel(); //设置布局 frame.setLayout(null); //坐标 frame.setBounds(300,300,500,500); frame.setBackground(new Color(226, 231, 225)); //panel设置坐标,其坐标是相对于frame的 panel.setBounds(10,25,200,300); panel.setBackground(new Color(40, 40, 40)); //把panel放入frame 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); } }); } }
执行结果(此时的窗口已经可以正常关闭):

按钮Button
在布局管理器流式布局中涉及
输入框TextField
在事件监听输入框事件监听涉及
布局管理器
流式布局(FlowLayout)
从左到右
package com.test.GUITest; import java.awt.*; public class TestFlowLayout { public static void main(String[] args) { Frame frame = new Frame("title"); //组件->按钮 Button button1 = new Button("button1"); Button button2 = new Button("button2"); Button button3 = new Button("button3"); //设置为流式布局 FlowLayout()中参数默认为CENTER(中间) //frame.setLayout(new FlowLayout());//CENTER //frame.setLayout(new FlowLayout(FlowLayout.LEFT));//LEFT frame.setLayout(new FlowLayout(FlowLayout.RIGHT));//RIGHT frame.setSize(400,400); //添加按钮组件 frame.add(button1); frame.add(button2); frame.add(button3); frame.setVisible(true); } }
执行结果:
CENTER:
LEFT:
RIGHT:
东西南北中布局(BorderLayout)
package com.test.GUITest; import java.awt.*; public class TestBorderLayout { public static void main(String[] args) { Frame frame = 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"); frame.add(east,BorderLayout.EAST); frame.add(west,BorderLayout.WEST); frame.add(south,BorderLayout.SOUTH); frame.add(north,BorderLayout.NORTH); frame.add(center,BorderLayout.CENTER); frame.setSize(500,500); frame.setVisible(true); } }
执行结果:

表格式布局(GridLayout)
package com.test.GUITest; import java.awt.*; public class TestGridLayout { public static void main(String[] args) { Frame frame = 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"); frame.setLayout(new GridLayout(3,2));//三行两列 frame.add(btn1); frame.add(btn2); frame.add(btn3); frame.add(btn4); frame.add(btn5); frame.add(btn6); frame.pack();//Java函数,优化布局 frame.setVisible(true); } }
执行结果:

练习
实现:
实现思路:
-
需要一个上下表格布局的窗口,上下两部分分别放置一个面板。
-
上部面板以左中右形式布局,左右各放一个Button,中部放置一个上下表格布局的面板,该面板放两个Button。
-
下部面板以左中右形式布局,左右各放一个Button,中部放一个两行两列布局的面板,该面板放四个Button。
package com.test.GUITest; import javax.swing.*; import javax.swing.border.Border; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class Test02 { public static void main(String[] args) { //创建窗口并指定属性 Frame frame = new Frame(); frame.setBounds(100,100,600,400); frame.setBackground(Color.cyan); 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)); //编辑上方面板 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); //编辑下方面板 p3.add(new Button("East-2"),BorderLayout.EAST); p3.add(new Button("West-2"),BorderLayout.WEST); for (int i = 0; i < 4; i++) { p4.add(new Button("p4-btn-"+(i+1))); } p3.add(p4,BorderLayout.CENTER); //上下面板添加到窗口 frame.add(p1); frame.add(p3); //监听关闭按钮 frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { //结束程序 System.exit(0); } }); } }
结果:

画笔Paint
演示:
package com.test.GUITest; import java.awt.*; /* * 画笔paint * */ public class TestPaint { public static void main(String[] args) { new MyPaint().loadFrame(); } } class MyPaint extends Frame{ public void loadFrame(){ setBounds(200,200,600,500); setVisible(true); } //画笔 @Override public void paint(Graphics g) { //画笔需要颜色,默认为黑色 g.setColor(Color.BLUE); //参数含义:xy 相对于frame的位置,width 长度 height 高度 g.drawOval(100,100,100,100);//圆环 g.setColor(Color.CYAN); g.fillOval(150,200,200,200);//实心圆 g.setColor(Color.RED); g.fillRect(400,150,100,200); //画笔用完将其还原到最初的颜色 g.setColor(Color.BLACK); } }

事件监听
示例:
package com.test.GUITest; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /* * 事件监听 * */ public class TestActionListener { public static void main(String[] args) { Frame frame = new Frame(); Button button = new Button("btn"); //因为addActionListener()需要一个ActionListener,所以需要构造一个ActionListener myActionListener myActionListener = new myActionListener(); button.addActionListener(myActionListener); frame.add(button,BorderLayout.CENTER); frame.pack(); //将关闭监听事件集成为方法 windowClose(frame); frame.setVisible(true); } private static void windowClose(Frame frame){ frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } } class myActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { System.out.println("鼠标点击按钮了"); } }
执行结果:

多个按钮共享一个事件:
package com.test.GUITest; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /* * 两按钮实现同一个监听 * */ public class TestActionListener02 { public static void main(String[] args) { Frame frame = new Frame(); Button start = new Button("start"); Button stop = new Button("stop"); //可以显式定义会返回的命令 start.setActionCommand("start-button02"); myMonitor myMonitor = new myMonitor(); start.addActionListener(myMonitor); stop.addActionListener(myMonitor); frame.add(start,BorderLayout.EAST); frame.add(stop,BorderLayout.WEST); frame.pack(); frame.setVisible(true); windowClose02(frame); } private static void windowClose02(Frame frame){ frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } } class myMonitor implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { //e.getActionCommand(); 可以获取按钮信息 System.out.println("按下按钮 + "+e.getActionCommand()); } }
执行结果:

输入框事件监听
TextField为输入文本框
示例:
package com.test.GUITest; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /* * 输入框事件监听 * */ public class TestText01 { public static void main(String[] args) { //main方法中只写启动 MyFrame02 myFrame02 = new MyFrame02(); windowClose(myFrame02); } private static void windowClose(Frame frame){ frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } } class MyFrame02 extends Frame{ public MyFrame02(){ TextField textField = new TextField(); add(textField); //监听文本框输入的文字 MyActionListener02 myActionListener02 = new MyActionListener02(); //按下enter 触发输入框事件 textField.addActionListener(myActionListener02); //设置输入密码形式 textField.setEchoChar('*'); setVisible(true); pack(); } } class MyActionListener02 implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { TextField field = (TextField) e.getSource();//获得一些资源,返回一个对象 System.out.println(field.getText());//获得输入框的文本 field.setText("");//输入后回车清空输入框中内容 } }
执行结果:
输入密码形式:


普通输入形式:


制作简易计算器
第一版:
package com.test.GUITest; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /* * 设计计算器 * */ public class TestCalculator { public static void main(String[] args) { Calculator calculator = new Calculator(); windowClose(calculator); } private static void windowClose(Frame frame){ frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } } //计算器面板 class Calculator extends Frame{ public Calculator(){ //三个文本框 TextField num1 = new TextField(10);//参数代表文本框可以容纳的最大字符数 TextField num2 = new TextField(10); TextField num3 = new TextField(20); //一个按钮 Button button = new Button("="); button.addActionListener(new MyCalculatorListener(num1,num2,num3)); //一个标签 Label label = new Label("+"); //设置布局 setLayout(new FlowLayout()); add(num1); add(label); add(num2); add(button); add(num3); pack(); setVisible(true); } } //计算器运算事件监听 class MyCalculatorListener implements ActionListener{ //通过传参的方式获取三个数字 private TextField num1,num2,num3; public MyCalculatorListener(TextField num1,TextField num2,TextField num3) { this.num1 = num1; this.num2 = num2; this.num3 = num3; } @Override public void actionPerformed(ActionEvent e) { //1. 获得两个加数 int n1 = Integer.parseInt(num1.getText()); int n2 = Integer.parseInt(num2.getText()); //2. 将两值做加法运算后放入第三个框 num3.setText(""+(n1+n2)); //3. 清楚前两个框 num1.setText(""); num2.setText(""); } }


将上述代码完全改造成面向对象:
package com.test.GUITest; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /* * 设计计算器 * */ public class TestCalculator { public static void main(String[] args) { Calculator calculator = new Calculator(); calculator.loadFrame(); windowClose(calculator); } private static void windowClose(Frame frame){ frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } } //计算器面板 class Calculator extends Frame{ //属性 TextField num1,num2,num3; //方法 public void loadFrame(){ //三个文本框 num1 = new TextField(10);//参数代表文本框可以容纳的最大字符数 num2 = new TextField(10); num3 = new TextField(20); //一个按钮 Button button = new Button("="); button.addActionListener(new MyCalculatorListener(this)); //一个标签 Label label = new Label("+"); //设置布局 setLayout(new FlowLayout()); add(num1); add(label); add(num2); add(button); add(num3); pack(); setVisible(true); } } //计算器运算事件监听 class MyCalculatorListener implements ActionListener{ //通过组合的方式获取三个数字,在一个类中组合另一个类 Calculator calculator = null; public MyCalculatorListener(Calculator calculator) { this.calculator = calculator; } @Override public void actionPerformed(ActionEvent e) { //1. 获得两个加数 // 2. 将两值做加法运算后放入第三个框 //3. 清楚前两个框 int n1 = Integer.parseInt(calculator.num1.getText()); int n2 = Integer.parseInt(calculator.num2.getText()); calculator.num3.setText(""+(n1+n2)); calculator.num1.setText(""); calculator.num2.setText(""); } }


内部类:
-
更好的包装
package com.test.GUITest; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /* * 设计计算器 * */ public class TestCalculator { public static void main(String[] args) { Calculator calculator = new Calculator(); calculator.loadFrame(); windowClose(calculator); } private static void windowClose(Frame frame){ frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } } //计算器面板 class Calculator extends Frame{ //属性 TextField num1,num2,num3; //方法 public void loadFrame(){ //三个文本框 num1 = new TextField(10);//参数代表文本框可以容纳的最大字符数 num2 = new TextField(10); num3 = new TextField(20); //一个按钮 Button button = new Button("="); button.addActionListener(new MyCalculatorListener()); //一个标签 Label label = new Label("+"); //设置布局 setLayout(new FlowLayout()); add(num1); add(label); add(num2); add(button); add(num3); pack(); setVisible(true); } //计算器运算事件监听 //内部类最大的好处,就是可以畅通无阻地访问外部类的属性和方法 private class MyCalculatorListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { //1. 获得两个加数 // 2. 将两值做加法运算后放入第三个框 //3. 清楚前两个框 int n1 = Integer.parseInt(num1.getText()); int n2 = Integer.parseInt(num2.getText()); num3.setText(""+(n1+n2)); num1.setText(""); num2.setText(""); } } }
鼠标监听
演示:
package com.test.GUITest; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /* * 鼠标监听 * */ public class TestMouseListener02 { public static void main(String[] args) { new MouseFrame(); } } class MouseFrame extends Frame { public MouseFrame() { setBounds(100,100,200,200); setVisible(true); this.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { System.out.println("Mouse Pressed!"); } }); } }

利用鼠标监听实现画画功能
package com.test.GUITest; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Iterator; /* * 鼠标监听事件 * */ public class TestMouseListener { public static void main(String[] args) { new MyFrame03("画图"); } } class MyFrame03 extends Frame{ //画画需要画笔,需要监听鼠标当前位置,需要集合来存储这些点 ArrayList points; public MyFrame03(String title) { super(title); setBounds(200,200,400,300); //存鼠标点击的点 points = new ArrayList(); setVisible(true); //鼠标监听器 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.CYAN); 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) { MyFrame03 frame03 =(MyFrame03) e.getSource(); //这里当鼠标点击的时候,就会在界面上产生一个点 //这个点就是鼠标的点 frame03.addPaint(new Point(e.getX(),e.getY())); //每次点击鼠标都需要重新画一遍 frame03.repaint(); } } }

思路:
窗口监听
演示:
在所有的窗口监听事件中关闭和激活使用较多
package com.test.GUITest; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /* * 窗口监听 * */ public class TestWindowListener { public static void main(String[] args) { new WindowFrame(); } } class WindowFrame extends Frame{ public WindowFrame() { setVisible(true); setBounds(100,100,200,200); setBackground(Color.gray); this.addWindowListener(new WindowAdapter() { //关闭窗口 @Override public void windowClosing(WindowEvent e) { System.out.println("windowClosing"); System.exit(0); } //激活窗口 @Override public void windowActivated(WindowEvent e) { System.out.println("windowActivated"); } }); //add(new Button("hide")); } }
键盘监听
演示:
package com.test.GUITest; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; /* * 键盘监听 * */ public class TestKeyListener { public static void main(String[] args) { new KeyFrame(); } } class KeyFrame extends Frame{ public KeyFrame() { setBounds(100,100,200,200); 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("Pressed Key:UP"); } } }); } }
事件监听总结
监听的添加可以使用内部类,也可以使用匿名内部类
使用匿名内部类可以总结为一种模板:
class XxxFrame extends Frame { public XxxFrame() { setBounds(100,100,200,200); setVisible(true); this.addXxxListener(new XxxAdapter() { @Override public void xxxPressed(XxxEvent e) { System.out.println("Xxx Pressed!"); } }); } } //其中的xxx可以替换成window、mouse、key等
Swing
窗口JFrame
-
与AWT不同的是,Swing需要面板获得容器才能安放组件或设置属性
-
Swing内置了窗口关闭的方法,不需要再监听窗口
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
演示:
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; public class JFrameTest { public void init() { JFrame jFrame = new JFrame("JFrame"); jFrame.setVisible(true); jFrame.setBounds(100,100,200,200); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置文字 JLabel jlabel = new JLabel("这是一段文字"); jFrame.add(jlabel); //设置文字居中 设置水平对齐 jlabel.setHorizontalAlignment(SwingConstants.CENTER); //获得一个容器 Container contentPane = jFrame.getContentPane(); contentPane.setBackground(Color.YELLOW); } public static void main(String[] args) { //建立一个窗口 new JFrameTest().init(); } }

容器ContentPane
Container container = jFrame.getContentPane();
弹窗JDialog
演示:
package com.test.GUITest.SwingTest; /* * 弹窗Dialog * */ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; //主窗口 public class DialogTest extends JFrame { public DialogTest() { setVisible(true); setBounds(100,100,500,600); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //JFrame 放东西,容器 Container container = this.getContentPane(); //绝对布局 container.setLayout(null); //按钮 JButton jButton = new JButton("点击弹出提示");//创建按钮 jButton.setBounds(50,50,100,50); container.add(jButton); //点击按钮时弹出窗口,事件监听 jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new MyDialog(); } }); } public static void main(String[] args) { new DialogTest(); } } //弹出的窗口 //原窗口已存在关闭事件,再写一遍会报错 class MyDialog extends JDialog{ public MyDialog(){ this.setVisible(true); this.setBounds(100,100,100,100); Container contentPane = this.getContentPane(); contentPane.setLayout(null); contentPane.add(new Label("提示")); } }

标签JLabel
-
标签上可以放文字,图标,图片
JLabel
new Jlabel("xxx");
图标Icon
演示:
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; /* * 图标,需要实现类,Frame继承 * */ public class TestIcon extends JFrame implements Icon { private int width; private int height; public TestIcon(){} public TestIcon(int width,int height) { this.width = width; this.height = height; } public void init(){ TestIcon testIcon = new TestIcon(15, 15); //图标可以放在标签上,也可以放在按钮上; JLabel jLabel = new JLabel("testIcon",testIcon,SwingConstants.CENTER); Container container = getContentPane(); container.add(jLabel); setVisible(true); setBounds(100,100,200,200); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestIcon().init(); } @Override public void paintIcon(Component c, Graphics g, int x, int y) { g.fillOval(x,y,width,height); } @Override public int getIconWidth() { return width; } @Override public int getIconHeight() { return height; } }
图片ImageIcon
演示:
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; import java.net.URL; public class TestImageIcon extends JFrame { public TestImageIcon() { //获取图片地址 JLabel jLabel = new JLabel("ImageIcon"); URL url = TestImageIcon.class.getResource("aaaa.jpg"); ImageIcon imageIcon = new ImageIcon(url); jLabel.setIcon(imageIcon); jLabel.setHorizontalAlignment(SwingConstants.CENTER); Container container = getContentPane(); container.add(jLabel); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setBounds(100,100,200,200); } public static void main(String[] args) { new TestImageIcon(); } }
-
此处在读取图片时可能有空指针异常,图片尺寸不合适可能导致无害显示图片

面板JPanel
JPanel
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; public class TestJPanel extends JFrame { public TestJPanel() { Container container = getContentPane(); //hgap vgap 的含义:间距 container.setLayout(new GridLayout(2,1,10,10)); JPanel p1 = new JPanel(new GridLayout(1, 3)); JPanel p2 = new JPanel(new GridLayout(1, 2)); JPanel p3 = new JPanel(new GridLayout(3, 1)); JPanel p4 = new JPanel(new GridLayout(2, 3)); p1.add(new JButton("1")); p1.add(new JButton("1")); p1.add(new JButton("1")); p2.add(new JButton("2")); p2.add(new JButton("2")); p3.add(new JButton("3")); p3.add(new JButton("3")); p3.add(new JButton("3")); p4.add(new JButton("4")); p4.add(new JButton("4")); p4.add(new JButton("4")); p4.add(new JButton("4")); p4.add(new JButton("4")); p4.add(new JButton("4")); container.add(p1); container.add(p2); container.add(p3); container.add(p4); setVisible(true); setSize(500,500); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestJPanel(); } }

JScrollPane
-
这里的文本域TextArea与文本框TextField不同,可以换行
-
这里的JScrollPane面板相较于普通面板多了滚动条
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; public class TestJScrollPanel extends JFrame { public TestJScrollPanel() { Container container = getContentPane(); //文本域 JTextArea jTextArea = new JTextArea(20, 50);//文本域的大小 jTextArea.setText("这一一个文本域"); //Scroll面板 JScrollPane jScrollPane = new JScrollPane(jTextArea); container.add(jScrollPane); setVisible(true); setBounds(100,100,200,200); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestJScrollPanel(); } }

按钮JButton
图片按钮
-
把图片放到按钮上需要借助标签
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; import java.net.URL; public class TextJButton01 extends JFrame { public TextJButton01() { Container container = this.getContentPane(); //将一个图片变成图标 URL url = TextJButton01.class.getResource("a.jpg"); Icon icon = new ImageIcon(url); //把图标放到按钮上 JButton jButton = new JButton(); jButton.setIcon(icon); jButton.setToolTipText("这是一个图片按钮"); //add container.add(jButton); this.setVisible(true); this.setBounds(100,100,400,600); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TextJButton01(); } }

单选按钮JRadioButton
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; import java.net.URL; public class TestJButton02 extends JFrame{ public TestJButton02() { Container container = this.getContentPane(); //将一个图片变成图标 URL url = TextJButton01.class.getResource("a.jpg"); Icon icon = new ImageIcon(url); //单选框 JRadioButton jRadioButton1 = new JRadioButton("jRadioButton1"); JRadioButton jRadioButton2 = new JRadioButton("jRadioButton2"); JRadioButton jRadioButton3 = new JRadioButton("jRadioButton3"); //由于单选框只能选一个,所以分组,一个组中只能选择一个 ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(jRadioButton1); buttonGroup.add(jRadioButton2); buttonGroup.add(jRadioButton3); container.add(jRadioButton1,BorderLayout.CENTER); container.add(jRadioButton2,BorderLayout.NORTH); container.add(jRadioButton3,BorderLayout.SOUTH); this.setVisible(true); this.setBounds(100,100,400,600); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestJButton02(); } }

复选按钮JCheckBox
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; import java.net.URL; public class TestJCheckBox03 extends JFrame { public TestJCheckBox03() { Container container = this.getContentPane(); //将一个图片变成图标 URL url = TextJButton01.class.getResource("a.jpg"); Icon icon = new ImageIcon(url); //多选框 JCheckBox jCheckBox1 = new JCheckBox("jCheckBox1"); JCheckBox jCheckBox2 = new JCheckBox("jCheckBox1"); container.add(jCheckBox1,BorderLayout.NORTH); container.add(jCheckBox2,BorderLayout.SOUTH); this.setVisible(true); this.setBounds(100,100,400,600); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestJCheckBox03(); } }

列表
列表JList
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; import java.util.Vector; public class TextJList extends JFrame { public TextJList() { Container container = getContentPane(); //生成列表的内容 //String[] contents = {"1","2","3"};//静态初始化 Vector contents = new Vector(); //列表中需要放入内容 JList jList = new JList(contents); contents.add("zhangsan"); contents.add("lisi"); contents.add("wangwu"); container.add(jList); setVisible(true); setBounds(100,100,500,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TextJList(); } }

下拉菜单JComboBox
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; public class TextJComboBox extends JFrame { public TextJComboBox() { Container container = getContentPane(); JComboBox jComboBox = new JComboBox(); jComboBox.addItem(null); jComboBox.addItem("下拉菜单一"); jComboBox.addItem("下拉菜单二"); jComboBox.addItem("下拉菜单三"); container.add(jComboBox); setVisible(true); setBounds(100,100,500,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TextJComboBox(); } }

文本框
文本框JTextField
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; public class TestText01 extends JFrame { public TestText01() { Container container = getContentPane(); JTextField jTextField = new JTextField("hello"); JTextField jTextField2 = new JTextField("world",30); container.add(jTextField,BorderLayout.NORTH); container.add(jTextField2,BorderLayout.SOUTH); setVisible(true); setBounds(100,100,500,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestText01(); } }

密码框JPasswordField
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; public class TestJText02 extends JFrame { public TestJText02() { Container container = getContentPane(); JPasswordField jPasswordField = new JPasswordField(); jPasswordField.setEchoChar('*'); container.add(jPasswordField); setVisible(true); setBounds(100,100,500,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestJText02(); } }

文本域TextArea
package com.test.GUITest.SwingTest; import javax.swing.*; import java.awt.*; public class TestJText03 extends JFrame { public TestJText03() { Container container = getContentPane(); JTextArea jTextArea = new JTextArea(20, 50); jTextArea.setText("123321"); container.add(jTextArea); setVisible(true); setBounds(100,100,500,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestJText03(); } }


浙公网安备 33010602011771号