<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zeyuphoenix

    愿我愛的人快樂,愿愛我的人快樂,為了這些,我愿意不快樂.

    表格(增加行號(hào))

    前面介紹了關(guān)于JTable的基本使用、JTable單元格的RendererEditorJTable的單元格的合并和拆分、JTableHeaderRendererEditor、JTableHeader的的合并和拆分等.現(xiàn)在介紹一種關(guān)于JTable表現(xiàn)的情況,比如我們從DB或者文件中取得數(shù)據(jù)之后,我們把它插入JTable之中時(shí),我們是想知道它的行號(hào)的,但是我們排序之后行號(hào)是不應(yīng)該變化的,這樣我們就不能把行號(hào)的數(shù)據(jù)和JTable的數(shù)據(jù)放置在一個(gè)Model(當(dāng)然也是有辦法的,比如我們重寫TableModel,當(dāng)數(shù)據(jù)改變時(shí),我們重寫FireTableChange方法更改數(shù)據(jù)行號(hào),但是很復(fù)雜.)

    我們一般的做法是設(shè)置另外一個(gè)JTable,重寫tableChangedpropertyChange,監(jiān)聽主JTable的變化,當(dāng)主JTable的數(shù)據(jù)變化時(shí),我們同時(shí)也更新這個(gè)行號(hào)JTable的數(shù)據(jù),這個(gè)就可以達(dá)到JTable的數(shù)據(jù)改變時(shí)我們行號(hào)JTable的數(shù)據(jù)也隨之改變.

    先看看完成的效果:

    排序后,行號(hào)是不變的:

    然后哦就是我們的實(shí)現(xiàn)了,先看行號(hào)那一列的類,先實(shí)現(xiàn)它的TableModel,

        /**

         *createtherowtablemodel.

         */

        privateclass RowHeaderModel extends AbstractTableModel {

    這個(gè)行JTableTableModel是和數(shù)據(jù)JTable是關(guān)聯(lián)的,我們根據(jù)數(shù)據(jù)的JTableModel調(diào)整這個(gè)行JTable.

    先是構(gòu)造函數(shù),很簡單,只需要傳入數(shù)據(jù)JTableModel.

        public RowHeaderModel(TableModel model) {

               this.model = model;

           }

    接下來是TableModel的方法的復(fù)寫:

        @Override

           publicint getColumnCount() {

               return 1;

           }

    只有一列數(shù)據(jù).

        @Override

           publicint getRowCount() {

               returnmodel.getRowCount();

           }

    行數(shù)和數(shù)據(jù)JTable的行號(hào)一樣.

        @Override

           public String getColumnName(int col) {

               return"";

           }

    不顯示表頭.

        @Override

           publicboolean isCellEditable(int row, int column) {

               returnfalse;

           }

    設(shè)置為不可編輯的.

    然后就是行號(hào)JTable的單元格的表現(xiàn)了,我們繼承TableCellRenderer,使它返回行號(hào).

        /**

         *createtablecellrenderer.

         */

        privateclass RowHeaderRenderer extends JButton implements

               TableCellRenderer {

    復(fù)寫getInsets使JTable的單元格沒有間隙

        @Override

           public Insets getInsets() {

               returnnew Insets(0, 0, 0, 0);

           }

    然后是實(shí)現(xiàn)TableCellRenderer的方法:

           @Override

           public Component getTableCellRendererComponent(JTable table,

                Object value, boolean isSelected, boolean hasFocus, int row, int column) {

               // set cell text

               this.setText("" + (row + 1));

    設(shè)置行號(hào)就可以了.

    然后就是行號(hào)JTable這個(gè)類了

    /**

     *createtherowtable.

     */

    publicclass RowTable extends JTable {

    實(shí)現(xiàn)很簡單,因?yàn)?/span>JTableModelRnederer已經(jīng)完成了,不需要再設(shè)置數(shù)據(jù)了:

    初始化設(shè)置ModelRenderer就可以了:

           setModel(new RowHeaderModel(table.getModel()));

           setRowHeight(table.getRowHeight());

           getColumn("").setCellRenderer(new RowHeaderRenderer());

    這樣行號(hào)JTable就完成了,現(xiàn)在我們需要實(shí)現(xiàn)一個(gè)類繼承JscrollPane,當(dāng)我們需要?jiǎng)?chuàng)建JTable時(shí),只需要根據(jù)我們的JTable創(chuàng)建行號(hào)JTable,然后把兩個(gè)JTable放置在我們自己的JscrollPane之中就可以了.

    /**

     *RowtableScrollPane.

     */

    publicclass RowTableScrollPane extends JScrollPane implements

           PropertyChangeListener, TableModelListener {

    它繼承JscrollPane實(shí)現(xiàn)PropertyChangeListenerTableModelListener接口,當(dāng)數(shù)據(jù)JTable變化時(shí),我們同時(shí)更新行號(hào)JTable的數(shù)據(jù).

    先看屬性,很簡單,需要放置的兩個(gè)JTable

        // row table

        protected RowTable rowHeader = null;

        // data table

        protected JTable table = null;

    構(gòu)造函數(shù)也很簡單,只需要傳入我們的數(shù)據(jù)JTable

        /**

         *

         */

        public RowTableScrollPane(JTable table) {

           if (table == null) {

               thrownew IllegalArgumentException("table is null");

           }

           this.table = table;

    然后初始化時(shí)構(gòu)造行號(hào)JTable,設(shè)置監(jiān)聽:

            table.addPropertyChangeListener(this);

           table.getModel().addTableModelListener(this);

           rowHeader = new RowTable(table);

    放置在JscrollPane上面:

           setViewportView(table);

           setRowHeaderView(rowHeader);

    響應(yīng)數(shù)據(jù)JTable的事件,當(dāng)數(shù)據(jù)JTable變化時(shí),同時(shí)更新行號(hào)JTable:

        @Override

        publicvoid propertyChange(PropertyChangeEvent e) {

           if (rowHeader != null) {

               rowHeader.setTableModel(table);

           }

        }

        @Override

        publicvoid tableChanged(TableModelEvent e) {

           if (rowHeader != null) {

               rowHeader.setTableModel(table);

           }

        }

    最后就是使用了,它的使用也很簡單,原本我們創(chuàng)建好JTable之后使用JscrollPane變現(xiàn)JTable:

            //Create the scroll pane and add the table to it.

            JScrollPane scrollPane = new JScrollPane(table);

    現(xiàn)在只需要把JscrollPane換成我們自己實(shí)現(xiàn)的RowTableScrollPane就可以了:

            RowTableScrollPane scrollPane = new RowTableScrollPane(table);

    這樣實(shí)現(xiàn)出來的JTable就自動(dòng)添加上表格了.

    最后再補(bǔ)充一點(diǎn),我們可以不使用JTable作為行號(hào)的那一列,使用一個(gè)Jlist也可以了,如下圖:

    實(shí)現(xiàn)方法也一樣,只需要實(shí)現(xiàn)JlistListModel時(shí)和JTableModel關(guān)聯(lián)就可以了,和前面介紹的JTable的例子一樣,把它們都放置在JscrollPane之上關(guān)聯(lián)PropertyChangeListenerTableModelListener事件就可以了,就不詳細(xì)介紹了,自此當(dāng)然我們也可以聯(lián)想到別的組件,只要我們可以實(shí)現(xiàn)一個(gè)組件的Model具有和JTable的數(shù)據(jù)關(guān)聯(lián)的特性,就可以作出另外的效果了.

    到這里為止,關(guān)于JTable的除了拖拽就算是完了,以后想到新的再補(bǔ)充了,下個(gè)開始寫JTree的,以后要寫ExtJS了,估計(jì)時(shí)間會(huì)少很多了.

    posted on 2010-04-19 22:58 zeyuphoenix 閱讀(4018) 評論(0)  編輯  收藏 所屬分類: JTable的使用

    導(dǎo)航

    <2010年4月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    統(tǒng)計(jì)

    常用鏈接

    留言簿(52)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品在线视频| 性色av免费观看| 亚洲乱码精品久久久久..| 猫咪免费观看人成网站在线| 哒哒哒免费视频观看在线www| 老司机福利在线免费观看| 亚洲精品无码激情AV| www免费插插视频| 亚洲国产精品无码久久久不卡| 免费萌白酱国产一区二区三区| 亚洲国产精品一区二区久久hs| 日本人成在线视频免费播放| 亚洲高清免费在线观看| 2021国产精品成人免费视频| 亚洲日韩精品A∨片无码加勒比| 免费观看美女裸体网站| 老司机午夜精品视频在线观看免费| 亚洲精品尤物yw在线影院| a级毛片视频免费观看| 内射少妇36P亚洲区| 成人免费无遮挡无码黄漫视频| 狠狠热精品免费观看| 亚洲一区二区女搞男| 免费无码一区二区三区| 一本天堂ⅴ无码亚洲道久久| 国产成人免费片在线观看| 久久嫩草影院免费看夜色| 亚洲高清不卡视频| 精品国产麻豆免费网站| 一级午夜a毛片免费视频| 91在线亚洲精品专区| 永久免费av无码网站大全| 三上悠亚在线观看免费| 91亚洲精品麻豆| 免费一级毛片在线播放| 97在线视频免费| 色天使亚洲综合一区二区| 亚洲av中文无码乱人伦在线r▽ | 亚洲最大成人网色香蕉| 免费一级毛片免费播放| 69精品免费视频|