Swing组件(下)

简介: 笔记

五、列表


Swing中提供了列表(JList)组件,可以单选或多选。

JList常用的构造方法有:


JList():创建一个列表对象。

JList(Object [] listData):创建一个列表对象,listData设置列表中选项。列表中选项内容可以是任意类,而不再局限于String。

下面通过示例介绍列表组件:

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/2/24
 * @time : 11:04 下午
 */
public class MyFrame extends JFrame {
    private String[] s1 = {"Java","python","php","c++","go","c","Javascript"};
    public MyFrame(String title){
        super(title);
//        创建标签
        JLabel label1 = new JLabel("请选择你喜欢的编程语言:");
        getContentPane().add(label1, BorderLayout.NORTH);
//        列表组件
        JList list = new JList(s1);
//        设置列表为单选
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//        注册项目选择事件监听器,采用匿名内部类
//        list.addListSelectionListener(new ListSelectionListener() {
//            @Override
//            public void valueChanged(ListSelectionEvent e) {
//                if (e.getValueIsAdjusting() == false){
                获取选择内容
//                    String itemString = (String) list.getSelectedValue();
//                    System.out.println(itemString);
//                }
//            }
//        });
//        注册项目选择事件监听器,采用Lambda表达式
        list.addListSelectionListener(e -> {
            if (e.getValueIsAdjusting() == false){
//                获取选择内容
                String itemString = (String) list.getSelectedValue();
                System.out.println(itemString);
            }
        });
        getContentPane().add(list,BorderLayout.CENTER);
//        设置窗口大小
        setSize(300,200);
//        设置窗口可见
        setVisible(true);
    }
}

调用代码:

public class HelloWorld {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame("列表");
    }
}

运行结果:

5.png



六、分隔面板


Swing中提供了一种分隔面板(JSplitPane)组件,可以将屏幕分成左右或上下两部分。JSplitPane常用的构造方法有:


JSplitPane(int newOrientation):创建一个分隔面板,参数newOrientation指定布局方向, newOrientation取值是JSplitPane.HORIZONTAL_SPLIT水平或JSplitPane.VERTICAL_SPLIT垂 直。

JSplitPane(int newOrientation, Component newLeftComponent, Component newRightComponent): 创建一个分隔面板,参数newOrientation指定布局方向,newLeftComponent左侧面板组件, newRightComponent右侧面板组件。

下面通过示例介绍分隔面板组件:

import javax.swing.*;
import java.awt.*;
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/2/24
 * @time : 11:44 下午
 */
public class MyFrame extends JFrame {
    private String[] data = {"景色1.jpeg","景色2.jpeg","景色3.jpeg","景色4.jpeg","景色5.jpeg","景色6.jpeg","景色7.jpeg","景色8.jpeg"};
    public MyFrame(String title){
        super(title);
//        右面面板
        JPanel rightpanel = new JPanel();
        rightpanel.setLayout(new BorderLayout(0,0));
        JLabel lblImage = new JLabel();
        lblImage.setHorizontalAlignment(SwingConstants.CENTER);
        rightpanel.add(lblImage,BorderLayout.CENTER);
//        左面面板
        JPanel leftpanel = new JPanel();
        leftpanel.setLayout(new BorderLayout(0,0));
        JLabel lblTextFieldLabel = new JLabel("选择景色图片:");
        lblImage.add(lblTextFieldLabel,BorderLayout.NORTH);
//        列表组件
        JList list = new JList(data);
//        设置成单选
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//        注册项目选择事件监听器,采用lambda表达式
        list.addListSelectionListener(e -> {
            if (e.getValueIsAdjusting()==false){
//                获得选择的内容
                String itemString = (String) list.getSelectedValue();
//                获得图片的绝对路径
                String Image = String.format("/Users/caizhengjie/Desktop/Swing相关图标/%s",itemString);
//              创建图片对象
                Icon icon = new ImageIcon(Image);
                lblImage.setIcon(icon);
            }
        });
        leftpanel.add(list,BorderLayout.CENTER);
//        分隔面板
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,leftpanel,rightpanel);
        splitPane.setDividerLocation(100);
        getContentPane().add(splitPane,BorderLayout.CENTER);
//         设置窗口大小
        setSize(960,640);
//        设置窗口可见
        setVisible(true);
    }
}

调用代码:

public class HelloWorld {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame("分隔面板");
    }
}

运行结果:

6.png

这里可以自己设置图片大小


七、表格


当有大量数据需要展示时,可以使用二维表格,有时也可以使用表格修改数据。表格是非常重要的组 件。Swing提供了表格组件JTable类,但是表格组件比较复杂,它的表现形式与数据分离的。Swing的 很多组件都是按照MVC设计模式进行设计的,JTable最有代表性,按照MVC设计理念JTable属于视 图,对应的模型是javax.swing.table.TableModel接口,根据自己的业务逻辑和数据实现TableModel接口 实现类。TableModel接口要求实现所有抽象方法,使用起来比较麻烦,有时只是使用很简单的表格, 此时可以使用AbstractTableModel抽象类。实际开发时需要继承AbstractTableModel抽象类。


JTable类常用的构造方法有:


JTable(TableModel dm) :通过模型创建表格,dm是模型对象,其中包含了表格要显示的数据。

JTable(Object[][] rowData, Object[] columnNames):通过二维数组和指定列名,创建一个表格对 象,rowData是表格中的数据,columnNames是列名。

JTable(int numRows, int numColumns):指定行和列数创建一个空的表格对象。

这里先介绍通过二维数组和列名实现表格。这种方式创建表格不需要模型,实现起来比较简单。但是表格只能接受二维数组作为数据。

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
public class MyFrameTable extends JFrame {
//    获得当前屏幕的宽和高
    private double screenWidth = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
    private double screenHight = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
//    表格数据,二维数组
    Object[][] rowdata = {{ "0036", "高等数学", "李放", "人民邮电出版社", "20000812", 1},
        {"0004", "FLASH精选", "刘扬", "中国纺织出版社", "19990312", 2},
        {"0026", "软件工程", "牛田", "经济科学出版社", "20000328", 4},
        {"0015", "人工智能", "周未", "机械工业出版社", "19991223", 3},
        {"0032", "SOL使用手册", "贺民", "电子工业出版社", "19990425", 2},
        {"0031","python数据分析","张俊红","电子工业出版社","19990426",10},
        {"0045","深入理解Java虚拟机","周志名","机械工业出版社","20100323",23}};
//    表格列名称
    String[] columnsNames = {"书籍编号", "书籍名称", "作者", "出版社", "出版日期", "库存数量"};
    private JTable table;
    public MyFrameTable(String title){
        super(title);
        table = new JTable(rowdata,columnsNames);
//        设置表格中内容字体
        table.setFont(new Font("微软雅黑",Font.PLAIN,16));
//        设置表列标题字体
        table.getTableHeader().setFont(new Font("微软雅黑",Font.BOLD,16));
//        设置行高
        table.setRowHeight(40);
//        设置为单行选中模式
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//        返回当前行的状态模型
        ListSelectionModel rowSM = table.getSelectionModel();
//        注册监听器,选中行发生更改时触发,这里采用匿名内部类
        rowSM.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
//                只处理鼠标按下
                if (e.getValueIsAdjusting() == false){
                    return;
                }
                ListSelectionModel lsm = (ListSelectionModel) e.getSource();
                if (lsm.isSelectionEmpty()){
                    System.out.println("没有选中行");
                }
                else {
                    int selectedRow = lsm.getMinSelectionIndex();
                    System.out.println("第"+selectedRow+"行被选中");
                }
            }
        });
//        创建一个滚动面板jScrollPane
        JScrollPane jScrollPane = new JScrollPane();
//        把表格添加到滚动面板上
        jScrollPane.setViewportView(table);
        getContentPane().add(jScrollPane,BorderLayout.CENTER);
//        设置窗口大小
        setSize(960,640);
//        计算窗口位于屏幕中心的坐标
        int x = (int) (screenWidth-960) /2;
        int y = (int) (screenHight-960) /2;
//        设置窗口位于屏幕中心的坐标
        setLocation(x,y);
//        设置窗口可见
        setVisible(true);
    }
}

调用代码:

public class HelloWorld {
    public static void main(String[] args) {
        MyFrameTable myFrameTable = new MyFrameTable("表格");
    }
}

运行结果:

7.png

这里由于数据太少没有显示滚动条,可以压缩窗口看见滚动条。


相关文章
|
6月前
|
Java 调度
Swing
Swing
45 3
Swing事件监听
Swing事件监听
|
Java 容器
Java Swing中的按钮和事件
Java Swing中的按钮和事件
|
Java 开发工具 容器
|
存储 Java 人机交互
Java GUI Swing组件
Java GUI Swing组件
228 0
Java GUI Swing组件
|
数据安全/隐私保护
Swing组件(上)
Swing所有组件都继承自JComponent,主要有文本处理、按钮、标签、列表、面板、组合框、滚动条、滚动面板、菜单、表格和树等组件。
Swing组件(上)
Swing设计一个下载器
1、package DownLoader.ui 中的类:APPMain、DownLoaderJFrame、MyProgressBar 2、package DownLoader.utils 中类:ClimbNetPage、DownLoader、DownLoaderTask、ImageUtil、Speeder 3、package DownLoaderTableMode 中的类:DownLoaderTableMode_Observer 4、package MyDataBasic 中的类TestDataBasic
177 0