美文网首页Java 杂谈
Java图形化:Swing表格的使用

Java图形化:Swing表格的使用

作者: java高级编程中心 | 来源:发表于2019-02-18 22:50 被阅读2次

在JTable类中除了默认的构造方法之外,还提供了利用指定表格列名数组和表格数据数组创建表格的构造方法,如下:

JTable(Object[][] rowData,Object[] columnNames)

rowData就是表格的数据数组

columnNames就是表格的列名数组。

使用表格时,一般将其添加到滚动面板中,然后将滚动面板加到相应的位置。

小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:664389243 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!

在JTable中还提供了利用指定表格的列名向量和表格数据向量创造表格的构造方法,如下:JTable(Vector rowData,Vector columnNames)

rowDara就是表格的数据向量

columnNames就是表格的列名向量

在使用表格时,有时候不需要使用滚动条,就可以在窗体中显示整个表格,在这种情况下,也可以直接将表格添加到相应的容器中。

注意:如果是将表格添加到相应的容器中,则需要通过JTable类的getTableHeader()方法获得JTableHeader类的对象,然后再将该对象添加到容器的相应位置,否则表格将没有列名。

简单表格案例:

package view.flight;

import javax.swing.*;

import java.awt.*;

/**

* @author: 我的袜子都是洞

*/

public class TestGui extends JFrame {

    // 列名

    String[] columnName = new String[]{"航班号", "出发时间", "飞行时间", "出发地", "目的地", "余票", "票价"};

    // 表格具体数据

    String[][] columnDate = new String[][]{

            {"1", "2019-01-18 10:05", "90分钟", "北京", "纽约", "50", "500.0"},

            {"2", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},

            {"3", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},

            {"4", "2019-01-18 10:05", "90分钟", "北京", "纽约", "40", "500.0"},

    };

    JTable table = new JTable(columnDate, columnName);

    TestGui(String title) {

        super(title);

        init();

        setComponent ();

        addComponent();

        addListener();

        setVisible(true);

    }

    private void init () {

        setSize(600, 400);

        // 设置窗口位置居中

        setLocationRelativeTo(null);

        // 设置布局

        setLayout(new BorderLayout());

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    private void setComponent () {

        // 设置第一列宽度为40

        table.getColumnModel().getColumn(0).setPreferredWidth(40);

        // 设置第二列宽度为120

        table.getColumnModel().getColumn(1).setPreferredWidth(120);

    }

    private void addComponent () {

        // 使用srcllpane会自动显示列名

        JScrollPane scrollPane = new JScrollPane(table);

        add(scrollPane, BorderLayout.CENTER);

    }

    private void addListener () {

    }

    public static void main(String[] args) {

        new TestGui("JTable演示");

    }

}

复制代码

定制表格

表格创建之后,还需要对其进行一系列的定义,以便适合于具体的使用情况。默认情况下双击单元格便可对其编辑,如果不需要此功能,可以通过重构JTable类的isCellEditable(int row,int column)方法实现该方法返回boolean型值true,表示可以编辑,否则返回false则表示不可编辑。

可通过JTableHeader类的setReorderingAllowed(boolean reorderAllowed)方法设置表格是否支持重新排列功能,该方法返回boolean型值true表示支持,返回false表示不支持。

默认情况下,单元格中的内容左侧显示,如果需要居中显示,可通过重构JTable类的getDefaultRenderer(Class<?> columnClass)方法来实现。 重构的代码:

public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {

    DefaultTableCellRenderer cr=(DefaultTableCellRenderer)super.getDefaultRenderer(columnClass);

    cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);

    return cr;

}

复制代码

JTable类的用来定义表格的常用方法

setRowHeight(int rowHeight)

setRowSelectionAllowed(boolean sa)

setSelectionMode(int sm)

setSelectionBackground(Color  cr)

setSelectionForeground(Color  fc)

setAutoResizeMode(int mode)

在利用setSelectionMode(int sm)方法设置表格行的选择模式时,它的入口参数从ListSelectionModel的静态常量中选择。如下:

静态常量:SINGLE_SELECTION,常量值:0,表示只选择一个。

静态常量:SINGLE_INTERVAL_SELECTION,常量值:1,表示允许连续选择多个

静态常量:MULTIPLE_INTERVAL_SELECTION,常量值:2,表示随意选择多个

在利用setAutoResizeMode(int mode)方法设置表格的自动调整模式时,它的入口参数从JTable类的静态常量中选择。

注意:表格的自动调整模式,就是在调整表格的某一列的宽度时,表格采用何种方式保持其总宽度不变。

操纵表格

在编写应用程序时,经常需要获得表格的一些信息,如下是JTable类中的三个经常用来获得表格信息的方法。

getRowCount()

getColumnCount()

getColumnName(int column)

JTable类中经常用来操纵表格选中行的方法如下:

setRowSelectionInterval(int from,int  to):选中行索引从from到to的所有行(包括索引为from到to的行)

addRowSelectionInterval(int from,int to):将行索引从from到to的所有行追加为表格的选中行

isRowSelected(int  row):查看行索引为row的行是否被选中

selectAll():选中表格中的所有行

clearSelection():取消所有选中行的选择状态

getSelectedRowCount():得到选中行的数量,返回值为int型,如果没有被选中的行,则返回-1

getSelectedRow():得到被选中的行中最小的索引值,返回值为int型,如果没有被选中的行,则返回-1 -getSelectedRows():获得所有被选中行的索引值,返回值为int数组

表格模型和表格

接口TableModel定义了一个表格模型,抽象类AbstracTableModel实现了TableModel接口的大部分方法,只有以下3个抽象方法没有实现。

public int getRowCount()

public int getColumnCount()

public Object getValueAt(int rowIndex,int columnIndex)

通过继承AbstractTableModel可以实现上面的3个抽象方法可以创建自己的表格模型类。DefaultTableModel类便是由Swing类提供的继承了AbstractTableModel类并实现了上面3个抽象方法的表格模型类。

从JDK1.6开始,提供了对表格进行排序的功能。通过JTable类的setRowSorter(RowSorter<? extends TableModel> sorter)方法可以为表格设置排序器。TableRowSorter类是由Swing提供的排序类,为表格设置排序器的代码如下:

DefaultTableModel tableModel=new DefaultTableModel();

JTable table=new JTable(tableModel);

table.setRowSorter(new TableRowSorter(tableModel));

复制代码

在使用表格排序器时,通常需要为其设置表格模型,一种方法是通过构造方法TableRowSorter(TableModel model),另一种方法是通过setModel(TableModel  model)方法为表格排序器设置表格模型。

维护表格模型

使用表格时,需要经常对表格中的内容进行维护,如向表格中添加新的数据行、修改表格中某一单元格的值、从表格中删除数据行等,这些操作都可以通过维护表格模型来完成。

在向表格模型中添加新的数据行时有两种情况:一种是添加到表格模型的尾部,另一种是添加到表格模型指定的索引处,分别由addRow(Object[] rowData)和insertRow(int row,Object[] rowData)或addRow(Vector rowData)和insertRow(int row,Vector rowData)方法实现。

如果需要修改表格模型中某一个单元格的数据,可以通过方法setValueAt(Object aValue,int row,int column)完成,其中aValue就是修改后的值,可以通过getValueAt(int row,int column)获得单元格的值,该方法返回Object型。

如果需要删除表格模型中某一行的数据,可以通过方法removeRow(int row)来完成,其中row为欲要删除行的索引。

使用TableModel模型案例:

import javax.swing.*;

import javax.swing.table.AbstractTableModel;

import java.awt.*;

/**

* @author: 我的袜子都是洞

*/

public class TestGui extends JFrame {

    JTable table = new JTable(new FlightTableModel());

    TestGui(String title) {

        super(title);

        init();

        setComponent ();

        addComponent();

        addListener();

        setVisible(true);

    }

    private void init () {

        setSize(600, 400);

        // 设置窗口位置居中

        setLocationRelativeTo(null);

        // 设置布局

        setLayout(new BorderLayout());

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    private void setComponent () {

        // 设置第一列宽度为40

        table.getColumnModel().getColumn(0).setPreferredWidth(40);

        // 设置第二列宽度为120

        table.getColumnModel().getColumn(1).setPreferredWidth(120);

    }

    private void addComponent () {

        // 使用srcllpane会自动显示列名

        JScrollPane scrollPane = new JScrollPane(table);

        add(scrollPane, BorderLayout.CENTER);

    }

    private void addListener () {

    }

    public static void main(String[] args) {

        new TestGui("JTable演示");

    }

}

class FlightTableModel extends AbstractTableModel {

    // 列名

    String[] columnName = new String[]{"航班号", "出发时间", "飞行时间", "出发地", "目的地", "余票", "票价"};

    // 表格具体数据

    String[][] flightDate = new String[][]{

            {"1", "2019-01-18 10:05", "90分钟", "北京", "纽约", "50", "500.0"},

            {"2", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},

            {"3", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},

            {"4", "2019-01-18 10:05", "90分钟", "北京", "纽约", "40", "500.0"},

    };

    /**

    * 返回一共多少行

    */

    @Override

    public int getRowCount() {

        return flightDate.length;

    }

    /**

    * 返回一共多少列

    */

    @Override

    public int getColumnCount() {

        return columnName.length;

    }

    /**

    * 返回每一个单元格的值

    */

    @Override

    public Object getValueAt(int rowIndex, int columnIndex) {

        return flightDate[rowIndex][columnIndex];

    }

    /**

    * 获取每一列的名称

    */

    @Override

    public String getColumnName(int column) {

        return columnName[column];

    }

    /**

    * 单元格是否可以修改

    */

    @Override

    public boolean isCellEditable(int rowIndex, int columnIndex) {

        return false;

    }

}

复制代码

效果:

通过监听选中单元格获取对应数据的实例:

import javax.swing.*;

import javax.swing.event.ListSelectionEvent;

import javax.swing.event.ListSelectionListener;

import javax.swing.table.AbstractTableModel;

import java.awt.*;

/**

* @author: 我的袜子都是洞

*/

public class TestGui extends JFrame {

    FlightTableModel flight = new FlightTableModel();

    JTable table = new JTable(flight);

    TestGui(String title) {

        super(title);

        init();

        setComponent ();

        addComponent();

        addListener();

        setVisible(true);

    }

    private void init () {

        setSize(600, 400);

        // 设置窗口位置居中

        setLocationRelativeTo(null);

        // 设置布局

        setLayout(new BorderLayout());

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    private void setComponent () {

        // 设置第一列宽度为40

        table.getColumnModel().getColumn(0).setPreferredWidth(40);

        // 设置第二列宽度为120

        table.getColumnModel().getColumn(1).setPreferredWidth(120);

    }

    private void addComponent () {

        // 使用srcllpane会自动显示列名

        JScrollPane scrollPane = new JScrollPane(table);

        add(scrollPane, BorderLayout.CENTER);

    }

    private void addListener () {

        // selection监听器监听表格哪行被选中

        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override

            public void valueChanged(ListSelectionEvent e) {

                // 被选中的行

                int row = table.getSelectedRow();

                String str = (String)flight.getValueAt(row,0);

                System.out.println("选中的行号是:"+row+",航班号是:"+str);

            }

        });

    }

    public static void main(String[] args) {

        new TestGui("JTable演示");

    }

}

class FlightTableModel extends AbstractTableModel {

    // 列名

    String[] columnName = new String[]{"航班号", "出发时间", "飞行时间", "出发地", "目的地", "余票", "票价"};

    // 表格具体数据

    String[][] flightDate = new String[][]{

            {"1", "2019-01-18 10:05", "90分钟", "北京", "纽约", "50", "500.0"},

            {"2", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},

            {"3", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},

            {"4", "2019-01-18 10:05", "90分钟", "北京", "纽约", "40", "500.0"},

    };

    /**

    * 返回一共多少行

    */

    @Override

    public int getRowCount() {

        return flightDate.length;

    }

    /**

    * 返回一共多少列

    */

    @Override

    public int getColumnCount() {

        return columnName.length;

    }

    /**

    * 返回每一个单元格的值

    */

    @Override

    public Object getValueAt(int rowIndex, int columnIndex) {

        return flightDate[rowIndex][columnIndex];

    }

    /**

    * 获取每一列的名称

    */

    @Override

    public String getColumnName(int column) {

        return columnName[column];

    }

    /**

    * 单元格是否可以修改

    */

    @Override

    public boolean isCellEditable(int rowIndex, int columnIndex) {

        return false;

    }

}

复制代码

关键部分:

// selection监听器监听表格哪行被选中

        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override

            public void valueChanged(ListSelectionEvent e) {

                // 被选中的行

                int row = table.getSelectedRow();

                String str = (String)flight.getValueAt(row,0);

                System.out.println("选中的行号是:"+row+",航班号是:"+str);

            }

        });

复制代码

获取到的结果图: 窗口图:

数据:

小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:664389243 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!

相关文章

  • Java图形化:Swing表格的使用

    在JTable类中除了默认的构造方法之外,还提供了利用指定表格列名数组和表格数据数组创建表格的构造方法,如下: J...

  • Java图形化:Swing表格的使用

    利用JTable类直接创建表格 创建表格: 在JTable类中除了默认的构造方法之外,还提供了利用指定表格列名数组...

  • 1.JFrame/JOptionPane

    Swing是在java的基础图形化用户界面AWT的基础上扩建的API集 Swing的功能:通过java代码编写窗口...

  • Java自学-图形界面 组件

    Swing 中的组件列表 JAVA的图形界面下有两组控件,一组是awt,一组是swing。一般都是使用swing ...

  • Burpsuite Python插件开发 - 编程环境篇

    java2python 使用java2python将网上的java代码(如swing示例代码)转成python,方...

  • Java Swing表格多列排序

    Java Swing JTable开启排序功能只需一个调用: 但这个排序功能只支持单列排序,而多列排序需要自己实现...

  • 初学 Swing 组件

    Swing 是一个为Java设计的GUI工具包。 Swing是JAVA基础类的一部分。 Swing包括了图形用户界...

  • Java自学-图形界面 表格

    Swing 使用 JTable详解 示例 1 : 基本表格 显示一个Table需要两组数据 一维数组: Strin...

  • Swing表格组件

    JTable类中用来定义表格的常用方法 ListSelectionModel类中用来设置选中模式的静态常量 JTa...

  • 实验5---Swing UI设计(简易计算器)

    一、实验目的 本实验的目的是掌握JAVA容器类JFrame和JPanel的使用;掌握Swing常用布局的使用;掌握...

网友评论

    本文标题:Java图形化:Swing表格的使用

    本文链接:https://www.haomeiwen.com/subject/atktyqtx.html