Java Swing简明笔记

本文详细介绍Swing组件库的特点及应用,涵盖JFrame、JDialog等窗体组件,以及标签、图标、文本框等控件的使用方法,深入探讨布局管理器如流布局、网格布局的设置技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Swing特点

  • Swing与Awt
    • Awt:
      • 在java.awt包中
      • 使用系统API编写,重量级框架
      • 不同平台风格不统一
    • Swing:
      • 在javax.swing包中
      • 使用纯Java语言编写,轻量级框架
      • 风格统一,不依赖平台
      • 可插入外观组件

二、Swing概述

  • 窗体组件类结构:

    java.lang.Object

    java.awt.Component(图形对象)

    java.awt.Container(容器对象)

    javax.swing.JComponent(组件)

    JPanel(面板)

    JButton(按钮)

    JLabel(标签)

    JTextField(文本框)

    JList(列表框)

    ……

    java.awt.Window(窗口)

    java.awt.Frame(窗体)

    javax.swing.JFrame(窗体)

    java.awt.Dialog(对话框)

    javax.swing.JDialog(对话框)

三、常用的Swing组件概述

  • 容器组件:
    • JFrame 窗体
    • JDialog 对话框
    • JPanel 面板
  • 功能组件:
    • JButton 按钮
    • JLabel 标签
    • JCheckBox 多选按钮
    • JRadioButton 单选按钮
    • JTextField 文本框
    • JPassword 密码框
    • JComboBox 下拉框
    • JTextArea 文本域
    • JList 列表框
    • JOptionPane 小对话框

四、JFrame窗体

public static void main(String[] args){
    
    JFrame f = new JFrame("窗体标题");//创建窗体对象
    
    f.setVisible(true);//设置窗体可见
    
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//隐藏窗口并终止程序
    /*
    窗体关闭时的参数:
    EXIT_ON_CLOSE:隐藏窗口并终止程序
    DO_NOTHING_ON_CLOSE:无任何操作
    HIDE_ON_CLOSE:隐藏窗体但不终止程序
    DISPOSE_ON_CLOSE:释放窗体资源(终止程序)
    */
    
    f.setSize(300,200);//设置窗体的大小,单位:像素
    
    f.setLocation(200,200);//设置窗体的坐标,单位:像素
    
    f.setBounds(200,200,300,200);//代替前面两个方法,可同时设定窗体的大小和坐标,单位:像素
    
    Container c = f.getContentPane();//获取窗体容器
    
    c.setBackground(Color.WHITE);//设置窗体背景颜色
    
    JLabel l = new JLabel("这是一个窗体");
    
    c.add(l);//添加组件
    
    c.remove(l);//删除组件
    
    c.validate();//做完增删操作后要验证容器中的组件(刷新窗体)
    
    //f.setContentPane(c);//重新载入容器(二者取其一即可)
    
    f.setResizable(false);//设置窗体是否可以改变大小,true为可改变(默认),false为不可改变
    
}

注意: 在正式开发中通常使用继承JFrame的方式实现一个新窗口:

public class MainPage extends JFrame {
    public MainPage(){
        setTitle("MainPage");//设置窗体的标题
        setVisible(true);//设置窗体可见
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//隐藏窗口并终止程序
        setSize(300,200);//设置窗体的大小,单位:像素
        setLocation(200,200);//设置窗体的坐标,单位:像素
        setBounds(200,200,300,200);//代替前面两个方法,可同时设定窗体的大小和坐标,单位:像素
    }
}

五、JDialog窗体

public class MyDialog extends JDialog {
    public MyDialog(JFrame frame){
        
        super(frame,"对话框标题",true);//在JFrame中生成一个对话框,通过super调用父类的构造方法
        /*
        第一个参数:父窗体对象
        第二个参数:对话框标题
        第三个参数:是否阻塞父窗体
        */
        
        Container c = getContentPane();//获取窗体容器
        c.add(new JLabel("这是一个对话框"));//向窗体容器中添加组件
        setVisible(true);//设置窗体可见
        setBounds(100,100,100,100);//设置窗体坐标的和大小
    }
    
    public static void main(String[] args){
        JFrame f = new JFrame("父窗体");
        f.setBounds(50,50,300,300);
        Container c = getContentPane();
        JButton btn = new JButton("弹出对话框");
        c.add(btn);
        f.setVisible(true);
        f.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        btn.addActionListener(new ActionListener(){//为按钮组件添加监听器
            @Override
            public void actionPerformed(ActionEvent e){
                MyDialog dialog = new MyDialog(f);
                dialog.setVisible(true);//设置对话框的可见性
            }
        });
    }
}

六、标签的使用

public class Demo extends JFrame {
    public Demo(){
        setBounds(100,100,100,100);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        setVisible(true);
        
        JLabel l = new JLabel("这是一个标签");
        l.setText("更改标签内容");//设置标签内容
        System.out.println(l.getText());//获取标签内容
        l.setFont(new Font("宋体",Font.BOLD,15));//设置标签字体,参数:字体名,字体粗细,字体大小
        l.setForeground(Color.RED);//更改前景色(字体颜色)
        c.add(l);
    }
    
    public static void main(String[] args){
        new Demo();
    }
}

七、图标的使用

public class Demo extends JFrame {
    public Demo(){
        setBounds(x,y,width,height);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        
        JLabel l = new JLabel("这是一个展示图片的标签");
        /*通过URL获取图标路径*/
        //URL url = Demo.class.getResource("iconName.png");//获取图片URL路径
        //System.out.println(url);//测试URL路径是否正确
        //Icon icon = new ImageIcon(url);//获取相应路径下的图片文件
      	
        /*或者直接写图标的绝对路径*/
        Icon icon = new ImageIcon("src/iconName.png");
        l.setIcon(icon);//通过JLabel添加图标
        l.setSize(20,20);//注意:即使设置标签大小也无法设置图标大小
        setVisible(true);
    }
    
    public static void main(String[] args){
        new Demo();
    }
}

八、控件布局

  • 绝对布局(null布局)

    • 使用绝对布局的窗口通常都是固定大小的,组件的位置和形状不会随着窗体的改变而变化

      public class Demo extends JFrame {
          public Demo(){
              setBounds(100,100,200,150);
              setDefaultCloseOperation(EXIT_ON_CLOSE);
              Container c = getContentPane();
              c.setLayout(null);//将容器的布局设为绝对布局,需要和setResizable(false)搭配使用
              /*注意:在绝对布局下容器中所有通过setBounds设置组件的位置是相对容器的位置,而不是相对窗口*/
              setVisible(true);
          }
      }
      
  • 流布局(FlowLayout)

    • 从左到右排列,默认居中对齐;

    • 流布局:像流水一样,向某个方向流动,遇到障碍就折回

      public class Demo extends JFrame {
          public Demo(){
              setBounds(100,100,300,200);
              setDefaultCloseOperation(EXIT_ON_CLOSE);
              
              Container c = getContentPane();
              c.setLayout(new FlowLayout());//给容器设置流布局(默认居中对齐)
              //c.setLayout(new FlowLayout(FlowLayout.LEFT));//左对齐的流布局
              //c.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));//加了水平间距和竖直间距的左对齐的流布局
              for(int i = 0; i < 10; ++i){
                  c.add(new JButton("按钮" + i));//向容器中添加按钮
              }
              
              setVisible(true);
          }
          
          public static void main(String[] args){
              new Demo();
          }
      }
      
  • 边界布局(BorderLayout)

    • 边界布局:东西南北中(EAST、WEST、SOUTH、NORTH、CENTER)

    • 注意:添加组件时,需要指定区域,否则默认添加到CENTER区域;同一个区域的组件会相互覆盖

    • 特性:纵向压缩只能看见南北,横向压缩东西南北中都能看见

      public class Demo extends JFrame {
          public Demo(){
              setBounds(100,100,350,200);
              setDefaultCloseOperation(EXIT_ON_CLOSE);
              Container c = getContentPane();
              c.setLayout(new BorderLayout());//给容器设置边界布局
              JButton b1 = new JButton("中"),b2 = new JButton("东"),b3 = new JButton("西"),b4 = new JButton("南"),b5 = new JButton("北");
              
              c.add(b1,BorderLyout.CENTER);
              c.add(b2,BorderLyout.EAST);
              c.add(b3,BorderLyout.WEST);
              c.add(b4,BorderLyout.SOUTH);
              c.add(b5,BorderLyout.NORTH);
              
              setVisible(true);
          }
      }
      
  • 网格布局(GridLayout)

    • 网格布局:可指定行和列的布局样式

    • 网格布局与流布局很相似,但网格布局几行几列是明确的,只会放缩组件的大小

    • 若组件数量超过行列总数时,则自动重新划分行列,并不会覆盖

      public class Demo extends JFrame {
          public Demo(){
              setBounds(100,100,300,300);
              setDefaultCloseOperation(EXIT_ON_CLOSE);
              Container c = getContentPane();
              c.setLayout(new GridLayout(7,3,5,5));//给容器设置网格布局,参数:行,列,水平间距,垂直间距
              for(int i = 0; i < 20; ++i){
                  c.add(new JButton("按钮" + i));
              }
              setVisible(true);
          }
      }
      
  • 网格组布局(GridBagLayout)

    • 使用方法:

      1. 先创建网格组布局对象:GridBagLayout gbl = new GridBagLayout();
      2. 将容器的布局样式设置为网格组布局对象:container.setLayout(gbl);
      3. 创建组件的约束对象:GridBagConstraints gbc = new GridBagConstraints();
      4. 向容器中添加组件:container.add(new JLabel("label"), gbc);参数:组件对象,约束对象
    • GridBagConstraints 常用属性:

      属性名描述
      gridx, gridy组件所在的位置
      gridwidth, gridheight组件所占用的行数和列数
      anchor组件所在的方位(九个方位)
      fill组件的填充方式(NONE,HORIZONTAL,VERTICAL,BOTH)
      insets组件与单元格边距的最小距离(四个参数:top,left,bottom,right)
      ipadx, ipady组件最开始的大小
      weightx, weighty一个单元格空间充足时的最大宽高
    • 代码示例:

      public class Demo {
          JFrame f = new JFrame();//主窗体
          Container container;//主容器
          
          void createFrame(){
              container = f.getContentPane();
              c.setLayout(new GridBagLayout());//为主容器设置网格组布局
              f.setSize(800,600);
              f.setLocationRelativeTo(null);//自动居中,但需要先设置size
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          }
          
          void init(){
              GridBagConstraints g1 = new GridBagConstraints();
              g1.gridx = 0;
              g1.gridy = 0;
              c.add(new JButton("组件1"), g1);
              GridBagConstraints g2 = new GridBagConstraints();
              g2.gridx = 1;
              g2.gridy = 1;
              c.add(new JButton("组件2"), g2);
              GridBagConstraints g3 = new GridBagConstraints();
              g3.gridx = 3;
              g3.gridy = 3;
              c.add(new JButton("组件3"), g3);
          }
          
          public static void main(String[] args){
              Demo d = new Demo();
              d.createFrame();
              d.init();//init方法将组件添加进容器
              d.f.setVisible(true);
          }
      }
      

九、下拉列表框的使用

public class Demo extends JFrame {
    public Demo(){
        setBounds(100,100,300,300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(null);//使用绝对布局
        
        //JComboBox<String> comboBox = new JComboBox<>();//通常使用的是String的泛型
        //comboBox.addItem("身份证");//方法一:通过addItem添加选项
        //comboBox.addItem("工作证");
        //comboBox.addItem("学生证");
        
        //String[] items = {"身份证","工作证","学生证"};//方法二:通过字符数组作参数添加选项
        //JComboBox<String> comboBox = new JComboBox<>(items);
        
        JComboBox<String> comboBox = new JComboBox<>();//方法三:通过下拉列表框模型添加选项
        String[] items = {"身份证","工作证","学生证"};
        ComboBoxModel cm = new DefaultComboBoxModel<>(items);//创建下拉列表模型,将字符数组作为参数
        comboBox.setModel(cm);//将模型置入下拉列表中
        
        JButton btn = new JButton("打印");//用于获取下拉列表中的数据
        btn.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                System.out.println("选中的索引:" + comboBox.getSelectedIndex());//获取选中索引
                System.out.println("选中的值:" + comboBox.getSelectedItem());//获取选中的值
            }
        });
        btn.setBounds(100, 10, 60, 20);
        c.add(btn);
        
        comboBox.setEditable(true);//将下拉列表设为可编辑(编辑后的值索引为-1)
        
        comboBox.setBounds(10,10,80,21);
        setVisible(true);
    }
}

十、列表框的使用

public class Demo extends JFrame {
    public Demo(){
        setBounds(100,100,200,150);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        Container container = getContentPane();
        container.setLayout(null);
        
        String[] items = {"元素1","元素2","元素3","元素4"};
        //JList<String> list = new JList<>(items);//方法一:通过字符数组添加列表项
        
        DefaultListModel<String> model = new DefaultListModelM<>();//方法二:通过默认列表模板添加列表项
        for(String tmp : items){
            model.addElement(tmp);//向模型中添加元素
        }
        JList<String> jl = new JList<>();
        jl.setModel(model);//向列表中置入模型
        
        jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置列表的选择模式
        /*
        SINGLE_SELECTION:单选
        SINGLE_INTERVAL_SELECTION:只能连续选择相邻元素(要加ctrl)
        MULTIPLE_INTERVAL_SELECTION:无限制,任意选
        */
        JScrollPane js = new JScrollPane(jl);//为列表添加滚动条以展示显示不全的元素
        js.setBounds(10,10,50,50);//为滚动容器设置大小
        container.add(js);
        
        JButton btn = new JButton("确认");
        btn.setBounds(120,90,70,25);
        btn.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0){
                List<String> values = jl.getSelectedValuesList();//获取列表中选中项的信息(注意是java.util.List)
                for(String tmp : values){
                    System.out.println(tmp);
                }
                System.out.println("---   THE END   ---");
            }
        });
        setVisible(true);
    }
    
    public static void main(String[] args){
        new Demo();
    }
}

十一、文本框的使用

public class Demo extends JFrame {
    public Demo(){
        setBounds(100,100,200,150);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        
        JTextField jt = new JTextField();
        jt.setColumns(20);//设置文本框长度,此处为20个字符
        jt.setText("text");//设置文本
        jt.setFont(new Font("黑体", Font.PLAIN, 20));//设置字体格式
        c.add(jt);
        
        JButton btn = new JButton("确认");
        btn.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0){
                System.out.println("文本框中的值为:" + jt.getText());//获取文本框中的文本值
                jt.setText("");//清空文本框
                jt.requestFocus();//获取焦点和光标
            }
        });
        c.add(btn);
        
        setVisible(true);
    }
}

十二、密码框的使用

public class Demo extends JFrame {
    public Demo(){
        setBounds(100,100,200,150);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        
        JPasswordField jp = new JPasswordField();
        jp.setColumns(20);//设置密码框长度,此处为20个字符
        jp.setFont(new Font("黑体", Font.BOLD, 20));//设置字体格式
        jp.setEchoChar("*");//设置回显字符
        
        jp.addActionListener(new ActionListener(){//添加动作监听:回车
            @Override
            public void actionPerformed(ActionEvent arg0){
                char[] ch = jp.getPassword();//获取密码的字符数组
                String str = new String(ch);
                System.out.println(str);
            }
        });
        c.add(jp);
        
        setVisible(true);
    }
}

十三、文本域的使用

public class Demo extends JFrame {
    public Demo(){
        setBounds(100,100,200,150);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        
        JTextArea jt = new JTextArea();
        jt.setColumns(20);//设置文本框长度,此处为20个字符
        jt.setText("Text");//设置文本
        jt.setFont(new Font("黑体", Font.PLAIN, 20));//设置字体格式
        jt.setRows(5);//设定文本域的行
        jt.setColumns(20);//设定文本域的列
        jt.append("添加内容");
        jt.insert("插入", 2);//在第二个字符后面插入内容
        JScrollPane js = new JScrollPane(jt);//添加滚动条
        
        c.add(js);
        setVisible(true);
    }
}

十四、监听事件

  • 监听事件简介
    • 监听Listener:KeyListener, MouseListener, WindowListener, ActionListener
    • 事件Event:KeyEvent, MouseEvent, WindowEvent, ActionEvent
  • 动作事件监听器(ActionListener)
    1. 添加动作监听器ActionListener。添加方法:使用 组件.addActionListener()进行添加
    2. 将实例化的ActionListener添加进参数列表。实例化方法:重写方法actionPerformed(ActionEvent e), 也就是当组件发生操作时调用的方法
  • 焦点事件监听器(FocusListener)
    1. 添加焦点监听器FocusListener。添加方法:使用 组件.addFocusListener()进行添加
    2. 将实例化的FocusListener添加进参数列表。实例化方法:重写方法focusGained(FocusEvent e)和focusLost(FocusEvent e), 也就是当组件获取焦点时调用的方法和失去焦点时调用的方法。
<think>嗯,用户是一个Java初学者,想要写笔记,主题是Java应用程序举例,包括结构和开发过程。需要一级和二级标题。首先,我要确定用户的需求是什么。他们可能希望有一个清晰的框架来组织笔记,可能需要例子来帮助理解结构和开发流程。 用户提到“Java应用程序举例”,所以可能需要具体的例子,比如经典的Hello World,或者更复杂的例子。不过作为入门,Hello World可能更合适。然后结构方面,需要解释类、main方法、代码结构这些基本元素。开发过程部分应该包括步骤,比如需求分析、编写代码、编译运行等。 一级标题应该用“#”,二级用“##”。可能需要先确定大致的结构。例如: 1. Java应用程序结构 1.1 基本组成部分 1.2 示例代码解析 2. Java应用程序开发过程 2.1 开发流程步骤 2.2 开发工具推荐 然后需要考虑用户可能遇到的困惑点,比如public static void main(String[] args)的作用,类与文件名的关系,编译运行的命令等。要确保内容准确且易于理解,避免使用复杂术语,或者至少解释清楚术语。 可能用户还需要知道开发工具,比如Eclipse、IntelliJ IDEA,或者命令行工具。这部分可以作为补充内容。另外,注意事项比如代码规范、调试技巧可能有帮助,但用户没有特别提到,可能需要判断是否必要。 需要检查是否有遗漏的部分,比如是否需要区分应用程序类型(控制台、图形界面),但作为初学者,可能先从控制台应用程序开始更合适。所以例子应该简单,避免涉及复杂的概念。 最后,确保结构清晰,标题层次正确,用Markdown格式,并且用中文回答。可能需要提供示例代码,并解释每部分的作用,比如类定义、main方法、System.out.println等。同时,开发过程中的每个步骤需要简明扼要,适合新手理解。</think>```markdown # Java应用程序举例与开发入门笔记 ## 一、Java应用程序结构 ### 1.1 基本组成部分 - **类(Class)**:Java程序的基本单位,每个`.java`文件对应一个公共类 - **main方法**:程序入口点,格式为 `public static void main(String[] args)` - **代码结构**: ```java public class HelloWorld { // 类声明(类名需与文件名一致) public static void main(String[] args) { // 主方法 System.out.println("Hello World!"); // 输出语句 } } ``` ### 1.2 示例代码解析 **简单计算器示例**: ```java public class Calculator { public static void main(String[] args) { int a = 10; int b = 5; System.out.println("加法结果:" + (a + b)); System.out.println("减法结果:" + (a - b)); } } ``` --- ## 二、Java应用程序开发过程 ### 2.1 开发流程步骤 1. **需求分析**:明确程序功能(如:实现简单计算器) 2. **编写代码**:使用IDE或文本编辑器创建`.java`文件 3. **编译程序**:`javac HelloWorld.java` → 生成`.class`字节码文件 4. **运行程序**:`java HelloWorld` 5. **测试调试**:检查输出结果是否符合预期 ### 2.2 开发工具推荐 1. **IntelliJ IDEA**(推荐初学者使用社区版) 2. **Eclipse** 3. **VS Code + Java扩展** 4. 命令行工具(适合学习编译原理) --- ## 三、典型应用程序示例 ### 3.1 控制台应用程序 ```java public class StudentManager { public static void main(String[] args) { String[] students = new String[3]; students[0] = "张三"; students[1] = "李四"; System.out.println("当前学生数量:" + students.length); } } ``` ### 3.2 简单图形界面程序(Swing) ```java import javax.swing.*; public class SimpleGUI { public static void main(String[] args) { JFrame frame = new JFrame("我的窗口"); frame.setSize(300, 200); frame.add(new JLabel("欢迎学习Java!")); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } ``` --- ## 四、注意事项 1. 严格区分大小写 2. 类名使用大驼峰命名法(如`StudentManager`) 3. 每行代码以分号结尾 4. 使用`//`进行单行注释,`/* */`进行多行注释 5. 注意代码缩进规范(推荐4个空格) > 提示:建议在笔记中添加自己的实践案例和遇到的问题记录,可通过`// TODO`标记待完善功能 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值