目前分類:JTable (15)

瀏覽方式: 標題列表 簡短摘要

上一次寫的 JTable Editor Demo 只有新增功能,但是沒有刪除功能。原本想要弄一個 toolbar,但是看起來又很醜,所以就想到要用 row header 來做。

row header 從 google 找來的資料有分二種,一個是用 JList 來做,一個是用 JTable。由於 JTable 做 rowheader 還可以拖拉改變寬度,所以我主要以 JTable 來做 row header。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天發現當我在 JTable 編輯 cell 時,直接按 button 儲存 JTable 內的值,結果最後一個 cell 卻沒有資料。最後發現當 JTable focus lost 時,並不會去執行 setValueAt,造成最後一個 cell 的值沒有被儲存。

上 google 查詢,發現很多人都在 JTable 加一個 FocusListener 去處理。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

JTable 原始設定是不支援編輯儲存格的,也就是只能看而已,但是有時候就希望能直接編輯 JTable 比較方便,而不是透過一個對方框來編輯資料。這篇文章寫到一半才發現,原來 DefaultTableModel 是有支援儲存格編輯功能,而是我常用的 AbstractTableModel 不支援才對。

一開始用 Google 查了很多資料,發現不是叫人自製 CellEditor,不然就是教人用 DefaultCellEditor(JComboBox) 來加入 JComboBox。都沒有很簡單的直接按二下就可以開始編輯,到最後一行又會自動產生一行新的。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

TableColumn 是包含在 TableColumnModel 裏面,而 JTable 包含一個 TableColumnModel。所以要取得 TableColumn 必須先取得 TableColumnModel 才可以。另外 JTable 也提供一個 getColumn(Object identifier) 函數來取得 TableColumn,主要也是透過 TableColumnModel.getColumnIndex(Object identifier) 來取得。

  1. TableColumn getColumn(int columnIndex)

    返回 columnIndex 位置列的 TableColumn 物件。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

當 JTable 內的資料有所變化時,JTable 要如何得知並做出相應的變化呢?其實 JTable implements TableModelListener,而且執行 setModel 時,就會做 dataModel.addTableModelListener(this)。所以只要執行 AbstractTableModel.fireTableDataChanged() 就可以即時變更 table 的內容。或是直接執行 JTable.tableChanged(null) 也可以。

// JTable.java
public void setModel(TableModel dataModel) {
......
    dataModel.addTableModelListener(this);
......
}

public JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
......
    if (dm == null) {
        dm = createDefaultDataModel();
    }
    setModel(dm);
    tableChanged(new TableModelEvent(dataModel, TableModelEvent.HEADER_ROW));
    firePropertyChange("model", old, dataModel);
......
}

public void tableChanged(TableModelEvent e) {
    if (e == null || e.getFirstRow() == TableModelEvent.HEADER_ROW) {
......
        resizeAndRepaint();
        return;
    }
......
}
// AbstractTableModel.java
public void fireTableDataChanged() {
    fireTableChanged(new TableModelEvent(this));
}
public void fireTableChanged(TableModelEvent e) {
......
    if (listeners[i]==TableModelListener.class) {
        ((TableModelListener)listeners[i+1]).tableChanged(e);
    }
......
}

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

設定的指令很簡單,就是使用 setPreferredSize 函數。 

JTable.getTableHeader().setPreferredSize(new Dimension(0, 50));

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

相信很多人都看過日本人 Nobuo Tamemasa 所寫的 MultipleRowHeaderExample,不過該範例是在 1999 年所寫的,跟現在的 java 已經有所不相容,而且程式碼很雜亂,不是很正規。

所以我就改用 Jeppers 的 JGrid bean 來呈現 multiple row header。下面是 demo 檔,各位看官可以自己試用看看。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

今天來記錄一下如何監控 JTable 的選擇變化。其實這個功能在寫資料庫應該會很用到,比如查看一個表單,然後自動在另一個 JTable 顯示出表單內的細項,這時就要監控第一個 JTable 選擇變化了。話說 JTable 裏包含三大 Model,有 TableModel 記錄所有資料,有 TableColumnModel 記錄表格標題的資料,最後就是 ListSelectionModel 記錄選擇的資料。而 Model 是做啥的,其實就是一堆資料的處理,包含取得,設定等,當然最重要的就是資料變化的通知;當 Model 資料產生變化時,會通知註冊在 Model 裏所有的 listener,而 listener 根據該變化做出所需的動作。

ListSelectionModel 相對應的監聽介面為 ListSelectionListener,加入監聽的函數為 addListSelectionListener。ListSelectionListener 介面只包含一個函數 valueChanged(ListSelectionEvent e),每次 ListSelectionModel 資料有變化時,就會呼叫 valueChanged;也就是當 JTable 選擇改變時,會執行 valueChanged 函數。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

一直以來對 TableCellRenderer 都搞不清楚,明明就只有一個簡單的函數,但是說明也太少了,少到完全不知要怎麼實現。現在就來看下面程式碼來搞清楚。

原始碼下載
String[] columnNames = { .....
Object[][] data = {.....
jTable = new JTable(data, columnNames);
jTable.getColumn("C").setCellRenderer(new ButtonRenderer());

public class ButtonRenderer extends JButton implements TableCellRenderer {
    public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2,
        boolean arg3, int arg4, int arg5)
    {
        this.setText((arg1 == null) ? "null" : arg1.toString());
        return this;
    }
}

上面的範例很簡單就是把 C 那一列都顯示 button,而 Object arg1 就是代表該儲存格的物件。如果把 this.setText 這一行拿掉,就只有顯示空白按鈕而已。所以從此就可以推論每一個儲存格要顯示時,都會呼叫 TableCellRenderer 傳回一個物件去顯示,而且每一個儲存格都有自己的 TableCellRenderer,預設為 DefaultTableCellRenderer。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

JTable 的選擇模式主要是靠下列三個函數來做設定。
  1. public void setColumnSelectionAllowed(boolean columnSelectionAllowed)
    設置是否可以選擇此模型中的列。
  2. public void setRowSelectionAllowed(boolean rowSelectionAllowed)

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

來源:http://softbbs.pconline.com.cn/6945883.html

在API裡已經介紹了這個接口,此接口定义了要成为 JTable 中单元格渲染器的任意对象所需的方法。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

要在jtable中插入图片,应该使用TableCellRenderer

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

表格(Table)的使用与介绍

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

這幾天,因為工作的需求必須要修改JTable的cell型態,讓他不只能顯示純文字,而能依照自己想要的方式顯示,因為JTable的架構設計得有點複雜,所以這個問題實在花了我不少時間研究,既然有了點研究結果,那就順便寫下來,這樣以後應該會比較方便。

台南小新 發表在 痞客邦 PIXNET 留言(1) 人氣()

http://www.blogjava.net/sitinspring/archive/2007/12/18/168425.html

台南小新 發表在 痞客邦 PIXNET 留言(3) 人氣()