五、列表
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("列表"); } }
运行结果:
六、分隔面板
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("分隔面板"); } }
运行结果:
这里可以自己设置图片大小
七、表格
当有大量数据需要展示时,可以使用二维表格,有时也可以使用表格修改数据。表格是非常重要的组 件。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("表格"); } }
运行结果:
这里由于数据太少没有显示滚动条,可以压缩窗口看见滚动条。