jtable 订阅
JTable 用来显示和编辑常规二维单元表。有关面向任务的文档和使用 JTable 的示例,请参阅 The Java Tutorial 中的 How to Use Tables 一节。 展开全文
JTable 用来显示和编辑常规二维单元表。有关面向任务的文档和使用 JTable 的示例,请参阅 The Java Tutorial 中的 How to Use Tables 一节。
信息
参考文献
The Java Tutorial
出    处
How to Use Tables 一节
用    途
显示和编辑常规二维单元表
中文名
jtable
jtable基本信息
JTableextends JComponentimplements TableModelListener, Scrollable, TableColumnModelListener, ListSelectionListener, CellEditorListener, Accessible, RowSorterListenerJTable 有很多用来自定义其呈现和编辑的工具,同时提供了这些功能的默认设置,从而可以轻松地设置简单表。例如,要设置一个 10 行 10 列的表: TableModel dataModel = new AbstractTableModel() { public int getColumnCount() { return 10; } public int getRowCount() { return 10;} public Object getValueAt(int row, int col) { return new Integer(row*col); } }; JTable table = new JTable(dataModel); JScrollPane scrollpane = new JScrollPane(table); 注意,如果要在单独的视图中(在 JScrollPane 外)使用 JTable 并显示表标题,则可以使用 getTableHeader() 获取并单独显示它。 要启用行的排序和过滤,请使用 RowSorter。可以通过以下两种方式之一设置一个行排序器。 直接设置 RowSorter。例如:table.setRowSorter(new TableRowSorter(model))。将 autoCreateRowSorter 属性设置为 true,从而 JTable 可用于创建 RowSorter。例如:setAutoCreateRowSorter(true)。设计使用 JTable 的应用程序时,务必要注意用来表示表数据的数据结构。DefaultTableModel 是一个模型实现,它使用一个 Vector 来存储所有单元格的值,该 Vector 由包含多个 Object 的 Vector 组成。除了将数据从应用程序复制到 DefaultTableModel 中之外,还可以用 TableModel 接口的方法来包装数据,这样可将数据直接传递到 JTable,如上例所示。这通常可以提高应用程序的效率,因为模型可以自由选择最适合数据的内部表示形式。在决定使用 AbstractTableModel 还是使用 DefaultTableModel 方面有一个好的实践经验,即在创建子类时使用 AbstractTableModel 作为基类,在不需要创建子类时则使用 DefaultTableModel。 源分布演示部分中的 "TableExample" 目录给出了许多 JTable 用法的完整示例,包括如何使用 JTable 来提供一个可编辑的数据视图(数据取自数据库),以及如何修改显示的列以使用指定的渲染器和编辑器。 JTable 使用专有的整数来引用它所显示的模型的行和列。JTable 采用表格的单元格范围,并在绘制时使用 getValueAt(int, int) 从模型中获取值。务必记住各种 JTable 方法所返回的列和行索引是就 JTable(视图)而言的,不一定是模型所使用的那些索引。 默认情况下,在 JTable 中对列进行重新安排,这样在视图中列的出现顺序与模型中列的顺序不同。但这根本不影响模型的实现:当列重新排列时,JTable 在内部保持列的新顺序,并在查询模型前转换其列索引。 因此编写 TableModel 时,不必侦听列的重排事件,因为不管视图怎样,模型都将在其自己的坐标系统被查询。在示例部分中有一个排序算法的演示,此演示正是使用了此技术在另一个坐标系统中进行排序,其中更改了行顺序,没有更改列顺序。 类似地,使用 RowSorter 提供的排序和过滤功能时,底层 TableModel 不需要知道怎样进行排序,RowSorter 将处理它。对底层 TableModel 使用 JTable 的基于行的方法时,必须进行坐标转换。所有基于 JTable 行的方法都是就 RowSorter 而言的,不一定与底层 TableModel 的方法相同。例如,选择始终是就 JTable 而言的,因此使用 RowSorter 时,需要使用 convertRowIndexToView 或 convertRowIndexToModel 进行转换。以下代码显示了如何将 JTable 的坐标转换为底层模型的坐标
收起全文
精华内容
下载资源
问答
  • JTable

    2020-07-13 17:28:29
    主题:jtable 布局 表格设置 可视化插件的使用方法 1、安装eclipse可视化插件 2、打开一个java文件,空白处右键Open With -->WindowBuilder Editor 更过细节,,,百度 思路 先通过可视化界面设置完成各个jpanel...

    一段新的旅程开始… 我的博客旅程开始啦,cute 玲
    主题:jtable

    布局

    表格设置

    可视化插件的使用方法

    1、安装eclipse可视化插件
    2、打开一个java文件,空白处右键Open With -->WindowBuilder Editor
    更多细节,,,百度

    思路

    先通过可视化界面设置完成各个jpanel,jtable,组件,在给jpanel设置属性,jtable设置属性 监听 数据 ,组件信息

    0.常用方法

    哼哼  不想写了
    

    1.表格隐藏列

    TableUtil.setTableColumnWidthAlign(taLst,6,0,1);//设置taLst表格得第6列列宽为0,该列就看不到啦
    

    2.表格监听

    啊啊啊不写了   此处略略略。。。
    

    3.表格选中行监听及数据获取

    taLst.addMouseListener(new MouseAdapter(){
    	@Override
    	public void mouseClicked(MouseEvent e){
    		taLst.getValueAt(2,3);//获取taLst第2行第3列得数据
    	}
    });//
    

    4.表格数据居中

    DefaultTableCellRenderer cr=new DefaultTableCellRender();
    cr.setHorizontalAlignment(SwingConstants.CENTER);
    taLst.setDefaultRenderer(Object.class,cr);
    

    5.表格自动调整列宽

    taLst.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//关闭原本的自动调整列宽的方法
    resizeColumnWidth(taLst);//调用自动调整列宽得方法,方法如下
    TableUtil.FitTableColumns(taLst);//使列自动展开或者收缩  宽度选择列名长度或者数据长度中最大的一个
    
    public void resizeColumnWidth(JTable table){
    	final TableColumnModel column=table.getColumnModel();
    	for(int column=0;column<table.getColumnCount();column++){
    		int width=15;
    		for(int row=0;row <table.getRowCount();row++){
    			TableCellRenderer renderer=table.getCellRenderer(row,column);
    			Component comp=table.prepareRenderer(renderer,row,column);
    			width=Math.max(comp.getPreferredSize().width+1,width);
    		}
    		if(width>300){
    		width=300;
    		columnModel.getColumn(column).setPrederredWidth(width);
    		}
    	}
    
    }
    
    

    6.弹出框

    1、先写一个弹出框

    public class TCDialog extends JDialog{//弹出框继承的是JDialog
    	public TCDialog(){
    	//XXX设置弹出框按钮、框、表格等
    	}
    	private void init(){
    	//弹出框内容初始化,根据得到的信息,给页面设置值
    	}
    	private void clearValue(){//初始化,清空init()得内容
    
    	}
    }
    

    2、一个界面中,点击一个按钮,如何弹出TCDialog弹出框??
    在按钮的点击事件中写如下代码:

    TCDialog tc=new TCDialog();
    tc.setModel(true)://设置tc对话框弹出的时候,其他窗口被屏蔽了,除非关闭tc窗口
    tc.setVisible(true);//弹出tc对话框
    

    7.表格刷新

    表格刷新首先是要建立在JTable已经创建过一次,刷新也就是给表格重新赋值。

    TableModelReflect moldelflect=(TableModelReflect )tableLst.getModel();//tableLst是JTable名称
    moldelflect.getTableData().clear();//清空数据
    moldelflect.getTableData().addAll((Connection)value)//value是表格数据的List
    TableUtil.FitTableColumns(tableLst);//调整表格列宽
    

    8.查询过程慢,加一个查询图标

    1.先写一个JLabel 作为一个旋转图标表示查询

    private static JLable timerLabel;
    

    2.写一个方法设置timerLabel是否可见

    public  JLabel  getTimerLabel(){
    	if(timerLabel ==null){
    		timerLabel=new JLabel("正在操作...");
    		timerLabel.setIcon(new ImageIcon("图片素材路径"));
    		timerLabel.setBounds(100,100,200,200);//设置图片大小
    		timerLabel.setFont(new Font("Dialog",Font.Bold,16));//设置字体大小
    		timerLabel.setVisible(false);
    	}
    	return timerLabel;
    }
    

    3.调用

    JButton butsearch=new JButton();//
    butsearch.addActionListener(new ActionListener(){
    	getTimerLabel().setVisible(true);
    	Thread thread=new Thread(new Ruunable(){
    		public void run(){
    		//XXXXX调用点击这个按钮执行的操作
    		getTimerLabel().setVisible(false);
    		}
    	});
    	thread.start();
    })
    

    9、GUI布局

    javax.swing.Box 有利于将几部分内容顺序摆放

    欢迎点赞集美们!!!

    展开全文
  • Jtable

    2019-10-02 07:24:05
    表格(JTable)  表格是Swing新增加的组件,主要功能是把数据以二维表格的形式显示出来。 使用表格,依据M-V-C的思想,最好先生成一个MyTableModel类型的对象来表示数据, 这个类是从AbstractTableModel类中...
     

    表格(JTable)

      表格是Swing新增加的组件,主要功能是把数据以二维表格的形式显示出来。
    使用表格,依据M-V-C的思想,最好先生成一个MyTableModel类型的对象来表示数据,
    这个类是从AbstractTableModel类中继承来的,其中有几个方法是一定要重写,例如
    getColumnCount,getRowCount,getColumnName,getValueAt。因为Jtable会从
    这个对象中自动获取表格显示所必需的数据,AbstractTableModel类的对象负责表格
    大小的确定(行、列)、内容的填写、赋值、表格单元更新的检测等等一切跟表格内容有
    关的属性及其操作。JTable类生成的对象以该TableModel为参数,并负责将TableModel
    对象中的数据以表格的形式显示出来。

      JTable类常用的方法有:
      getModel() //获得表格的数据来源对象
      JTable(TableModel dm) //dm对象中包含了表格要显示的数据
      //下列两个构造方法,第一个参数是数据,第二个参数是表格第一行中显示的内容
      JTable(object[][]rowData,object[]columnNams);
      JTable(Vector[][]rowData,Vector[]columnNams);

     例7.3 RecorderOfWorkers
      import Javax.swing.JTable;
      import Javax.swing.table.AbstractTableModel;
      import Javax.swing.JScrollPane;
      import Javax.swing.JFrame;
      import Javax.swing.SwingUtilities;
      import Javax.swing.JOptionPane;
      import Java.awt.*;
      import Java.awt.event.*;

      public class TableDemo extends JFrame {
        private boolean DEBUG = true;
            //实现构造方法
        public TableDemo() {
        //首先调用父类JFrame的构造方法生成一个窗口
       super("RecorderOfWorkers");
        //myModel存放表格的数据
         MyTableModel myModel = new MyTableModel();
    //表格对象table的数据来源是myModel对象
       JTable table = new JTable(myModel);
         table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    //产生一个带滚动条的面板
          JScrollPane scrollPane = new JScrollPane(table);

          //将带滚动条的面板添加入窗口中
          getContentPane().add(scrollPane, BorderLayout.CENTER);

          addWindowListener(new WindowAdapter() {//注册窗口监听器
            public void windowClosing(WindowEvent e) {
              System.exit(0);
            }
          });
      }
            //把要显示在表格中的数据存入字符串数组和Object数组中
      class MyTableModel extends AbstractTableModel {
         //表格中第一行所要显示的内容存放在字符串数组columnNames中
          final String[] columnNames = {"First Name",
                      "Position",
                      "Telephone",
                      "MonthlyPay",
                      "Married"};
         //表格中各行的内容保存在二维数组data中
          final Object[][] data = {
            {"Wangdong", "Executive",
            "01068790231", new Integer(5000), new Boolean(false)},
            {"LiHong", "Secretary",
            "01069785321", new Integer(3500), new Boolean(true)},
            {"LiRui", "Manager",
            "01065498732", new Integer(4500), new Boolean(false)},
            {"ZhaoXin", "Safeguard",
            "01062796879", new Integer(2000), new Boolean(true)},
            {"ChenLei", "Salesman",
            "01063541298", new Integer(4000), new Boolean(false)}
          };

          //下述方法是重写AbstractTableModel中的方法,其主要用途是被JTable
    //对象调用,以便在表格中正确的显示出来。程序员必须根据采用的数据类型加以恰当实现。
     
          //获得列的数目

          public int getColumnCount() {
             return columnNames.length;
          }

          //获得行的数目
          public int getRowCount() {
             return data.length;
          }

          //获得某列的名字,而目前各列的名字保存在字符串数组columnNames中
          public String getColumnName(int col) {
             return columnNames[col];
          }

          //获得某行某列的数据,而数据保存在对象数组data中
          public Object getValueAt(int row, int col) {
             return data[row][col];
          }

          //判断每个单元格的类型
          public Class getColumnClass(int c) {
             return getValueAt(0, c).getClass();
          }

          //将表格声明为可编辑的
          public boolean isCellEditable(int row, int col) {

             if (col < 2) {
               return false;
             } else {
               return true;
             }
          }

          //改变某个数据的值
          public void setValueAt(Object value, int row, int col) {
             if (DEBUG) {
               System.out.println("Setting value at " + row + ",
                     " + col
                      + " to " + value
                      + " (an instance of "
                      + value.getClass() + ")");
             }

             if (data[0][col] instanceof Integer
                 && !(value instanceof Integer)) {
              try {
                 data[row][col] = new Integer(value.toString());
                 fireTableCellUpdated(row, col);
              } catch (NumberFormatException e) {
                 JOptionPane.showMessageDialog(TableDemo.this,
                  "The \"" + getColumnName(col)
                  + "\" column accepts only integer values.");
              }
          } else {
              data[row][col] = value;
              fireTableCellUpdated(row, col);
          }

          if (DEBUG) {
              System.out.println("New value of data:");
              printDebugData();
          }
       }

       private void printDebugData() {
         int numRows = getRowCount();
          int numCols = getColumnCount();

          for (int i=0; i < numRows; i++) {
            System.out.print(" row " + i + ":");
            for (int j=0; j < numCols; j++) {
              System.out.print(" " + data[i][j]);
            }
            System.out.println();
          }
          System.out.println("--------------------------");
       }
      }

      public static void main(String[] args) {
       TableDemo frame = new TableDemo();
       frame.pack();
       frame.setVisible(true);
      }
     }

    转载于:https://www.cnblogs.com/seerlin/archive/2007/12/14/995591.html

    展开全文
  • jtable

    2020-12-14 11:31:55
    如何在jtable中选中一行后双击弹出一个jinternalframe框,把在jtable中选中行的数据通过查询在jinternalframe中展现出来,急求谢谢
  • jTABLE

    2011-05-29 23:28:00
    在运行时设置JTable的选项  作者:未知 来源:月光软件站加入时间:2005-2-28 月光软件站-在运行时设置JTable的选项  概述 Jtable类提供丰富的网格数据显示功能。这个技巧处理有关动态改变诸如...
    在运行时设置JTable的选项
     
     

    作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

    -

    在运行时设置JTable选项

     

    概述
    Jtable类提供丰富的网格数据显示功能。这个技巧处理有关动态改变诸如滚动条,列宽以及行高等通常的外观的问题 (900 words; 九月14, 2001) (九月 202001译)

    Java基础类(JFC)为创建一个精巧和交互的图形用户界面(GUIs)提供了丰富的组件选择。你可以使用javax.swing.JTable 显示表格式的数据。在这个技巧中,我们研究如何JTable 的常见问题。

    首先让我们定义一个最初的,基本的Jtable类――MyTable:
    import javax.swing.table.*;
    import javax.swing.*;
    import java.awt.*;
    public class MyTable extends JTable{
          //缺省构造函数
          public MyTable(){
               super();
               }
          //使用指定的行列数创建表格的构造函数
            public MyTable(int row, int col){
                super(row, col);
                }
         }

    相当简单!! 我们最初的 MyTable 实现就是一个普通的Jtable 。

    下一节,我们将致力于不同的JTable 显示选项――例如滚动条,列宽,选择性以及其它一些属性。我们将扩充MyTable 并且合并一些不同的方法使得它支持我们想要的显示特性。每一节增加一个新方法到MyTable ,最后我们得到一个可完全复用的Jtable 。

    滚动表格
    首先,让我们的JTable 显示一些表格式的数据。我创建TableColumnTest示范Jtable 的能力:

    import javax.swing.table.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    /**Author Sonal Goyal, sonal_goyal@hotmail.com
    */
    public class TableColumnTest{
        protected JFrame frame;
        protected JScrollPane scrollpane;
        protected MyTable table;
        public TableColumnTest(){
          //(1) 创建表格模型。
          DefaultTableModel dm = new DefaultTableModel();
          // 每列的名字
          String[] columnNames = {
                "This is going to be a really long column header",
                "Column B", "Column C", "Column D", "Column E", "Column F",
                "Column G", "Column H", "Column I",  "Column J"
                };

          // 实际的数据值
          Integer[][] data = new Integer[8][10];
          // 初始化数据矩阵。
          for (int row = 0; row < 8; row++){
                for (int col = 0; col < 10; ++col){
                      data[row][col] = new Integer(1000000);
                }
          }
          // 设置模型和数据及列头关联

          dm.setDataVector(data, columnNames);
          //(2) 创建表格
          table = new MyTable();
          //(3) 连接模型和表格
          table.setModel(dm);
          //(4) 为表格创建滚动面板
          scrollpane =  new JScrollPane(table);
          //(5) 显示表格
          frame =  new JFrame();
          frame.getContentPane().add(scrollpane);
          frame.setSize(200, 150);
          frame.setVisible(true);
      }
    public static void main(String[] args){
           TableColumnTest test = new TableColumnTest();
    }

    示范程序相当简单。我们通过下面的步骤构造了一个简单的JTable:

    ·         创建并设置TableModel, 它包含行,列,列头以及数据数据的信息

    • 创建并设置JTable, 它根据模型显示数据
    • JTable 和第一步创建的模型关联

    但是在这个代码里有一个曲解: 第四步加入了一个滚动面板。我们将构建的表格显示在一个Jframe里面; 参看图1

     

    1. 杂乱的滚动

    就像图1显示的那样,很难辨别任何列头或者是表格数据。虽然我们增加了滚动条,但水平滚动条没有显示。让我们详细的查看JTable 来揭示原因。JTable 有一个自动调整大小的模式,这将决定表格是否自动的调整列宽 (去覆盖表格的整个宽度) 以及如何进行调整。可以使用下面的值:

    ·         AUTO_RESIZE_OFF: 不自动调整列宽; 使用滚动条

    • AUTO_RESIZE_NEXT_COLUMN: 当一列被调整,反向调整下一列
    • AUTO_RESIZE_SUBSEQUENT_COLUMNS: 在调整时改变后续列以保持总的宽度
    • AUTO_RESIZE_LAST_COLUMN: 在所有的调整操作上只将调整应用到最后一列
    • AUTO_RESIZE_ALL_COLUMNS: 在所有的调整操作上成比例的调整所有的列。

    缺省情况下,JTable 调整其它列以保持总的外观,就像图1说明的那样。因此,如果我们想用水平滚动条显示列,我们需要给MyTable 添加一个方法并在构造函数里面调用它:

    /**这个方法在需要的时候显示水平滚动条

     * 两个构造函数都调用它
         */
         public void showHorScroll(boolean show){
          if (show){
              setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
          }else{
              setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
          }
         }

    2 显示了一个可见的水平滚动条:

    2. 可见的水平滚动条

    控制JTable 的列
    你可以控制列的宽度,也可以使它们不可调整,这一节展示该如何做。

    加宽列
    通常你想让一个列必另一个更宽或更窄。要改变列的宽度,你可以使用TableColumnModel:

          /**这个方法设置pColumn指示的列的宽度为pWidth
           */
          public void setColumnWidth(int pColumn, int pWidth){
                //得到列的样式
                TableColumnModel colModel = getColumnModel();
                //得到pColumn列然后设置它的最佳宽度
                    colModel.getColumn(pColumn).setPreferredWidth(pWidth);
          }

    你也可以给Jframe增加一个按钮以及它的监听器,点击按钮改变表格的宽度:

        JButton resizeButton = new JButton("Resize Third Column");
        setResizeButton.addActionListener(this);
        public void actionPerformed(ActionEvent e){
          //检查是哪一个按钮被点击
              if (e.getActionCommand().equals("Resize Third Column")){
                     System.out.println("Resize called - resizes third column
        to 300");
                     table.setColumnWidth(2, 300);
                     //强制GUI刷新
                     table.invalidate();
                     frame.invalidate();
                     frame.validate();
                     frame.repaint();
                }

    在这个例子中, pColumn 是列的索引值,pWidth 是新的列宽。点击Resize 按钮的效果显示为图3 4

     

    3. 点击前

     

     

    图四 4. 点击后

    不可变列
    对于通常的应用,你可以拖动列头调整列的大小。下面的代码根据pIsResize 的值设置表格的调整性。如果pIsResize true, 列宽可以调整;否则不能:

        public void setResizable(int pColumn, boolean pIsResize){
          //得到列的样式
          TableColumnModel colModel = getColumnModel();
          //设置可调整性
          colModel.getColumn(pColumn).setResizable(pIsResize);
        }

    在这个例子中, pColumn 是不可调整列的索引值。得到列(getColumn(..))然后设置一个简单的属性 (setResizable(..)) 就是全部要做的。

    列的选择性
    为什么不在点击按钮时选中整列而不只是一个单元? JTable 通过调用单元的isCellSelected(int row, int col)方法显示该单元是否被选中。重载这个方法可以给你想要的结果,结果和传递到setSelect(int col, boolean select)的参数select有关。如果为false 将不被选中。关键是将该列设置为colSelect(), "select" 标记指明该列是被选中还是取消选中:

       int colSelect;
        boolean select;
        /** 设置列col 为选中或取消选中
          * -根据select决定
         */
         public void setSelect(int col, boolean select){
          colSelect = col;
          this.select = select;
         }
        /**这个方法返回某个单元是否被选中
         */
        public boolean isCellSelected(int row, int column)
          throws IllegalArgumentException{
          //重载verride the method for the column set in setSelect()
          if (colSelect == column){
              if (select)
                return true;
              else
                return false;
          } else {
              return super.isCellSelected(row, column);
          }
        }

    5 显示了Column D 被选中的结果。

     

    5. 选中整列

    控制列头
    你可能注意到第一列列头的长度比列宽大。我们通过重设列宽来处理这个:

    /**根据列头文本的宽度设置列头和列的大小
    */
    public void setHeaderSize(int pColumn){
          //得到指定列的名字
          String value =  getColumnName(pColumn);
          //计算列宽
          FontMetrics metrics = getGraphics().getFontMetrics();
          int width = metrics.stringWidth(value) +
    (2*getColumnModel().getColumnMargin());
          //设置宽度
          setColumnWidth(pColumn, width);
    }

    上面的代码被执行后重设列头的结果显示在图6中。

     

    6. 完全可见的列头

    特性丰富的JTable
    在这个技巧中,我们在简单的Jtable 上测试了不同的选项,并且在表格被显示后改变那些选项。在这个过程中,我们开发了一个能提供丰富的用户界面能力的表格。研究JTable's 的其它属性看看你能创建一个什么样的有趣表格!

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,802
精华内容 4,320
关键字:

jtable