簡體   English   中英

我如何創建兩個具有相同Columnmodel但具有不同模型的Jtables

[英]How can i create two Jtables which have same Columnmodel, but they have different models

我設計了兩個具有相同columnmodel的jtable,因此它們會相應地調整大小,這兩個jtable應該具有相同的列號,當我們調整列大小或更改滾動條時,我希望它們以相同的方式表現。 現在我有一個問題,當我調整第二個表的大小時,行上的列不會更改其大小,並且滾動條也不會相應地表現。

我的代碼就是這樣

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;

public class CompFilteredTable extends JPanel{
    private JTable tblFilter;
    private JTable tblData;
    private JScrollPane scrollPane;
    private JScrollPane scrollPane_1;
    public CompFilteredTable() {
        setLayout(new BorderLayout(0, 0));
        add(getScrollPane_1(), BorderLayout.NORTH);
        add(getScrollPane(), BorderLayout.CENTER);
    }



    public JTable getTblFilter() {
        if (tblFilter == null) {
            tblFilter = new MyTable(new TestTableModel2());
            tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            tblFilter.setTableHeader (null);
        }
        return tblFilter;
    }
    public JTable getTblData() {
        if (tblData == null) {
            tblData = new MyTable(new TestTableModel());
            tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

            tblFilter.setColumnModel(tblData.getColumnModel());
        }   
        return tblData;
    }

    private class MyTable extends JTable {
        private MyTable (final TableModel model) {
            super (model);
        }

        private boolean isColumnMarginChangeInProgress=false;
        @Override
        public void columnMarginChanged(final ChangeEvent e) {
            if (isColumnMarginChangeInProgress) {
                return;
            }
            isColumnMarginChangeInProgress = true;

            if (isEditing()) {
                removeEditor();
            }
            TableColumn resizingColumn = null;
            if (tableHeader != null) {
                resizingColumn = tableHeader.getResizingColumn();
            }
            if (resizingColumn != null) {
                if (autoResizeMode == AUTO_RESIZE_OFF) {
                    resizingColumn.setPreferredWidth(resizingColumn.getWidth());
                } else {    // this else block is missing in jdk1.4 as compared to 1.3
                    doLayout();
                    repaint();
                }
            } else {
                resizeAndRepaint();
            }
            isColumnMarginChangeInProgress = false;
        }
    }



    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(600, 400));

        CompFilteredTable compFilteredTable = new CompFilteredTable();

        frame.getContentPane().add(compFilteredTable);
        frame.pack();
        frame.setVisible(true);

    }

    private class TestTableModel extends DefaultTableModel {
        @Override
        public int getRowCount () {
            return 10;
        }
        @Override
        public int getColumnCount () {
            return 10;
        }
        @Override
        public String getColumnName (final int column) {
            return "Col-"+column;
        }

        @Override
        public Object getValueAt (final int row, final int column) {
            return (row * column) + "";
        }
    }

    private class TestTableModel2 extends DefaultTableModel {
        @Override
        public int getRowCount () {
            return 1;
        }
        @Override
        public int getColumnCount () {
            return 10;
        }
        @Override
        public String getColumnName (final int column) {
            return "Col-"+column;
        }

        @Override
        public Object getValueAt (final int row, final int column) {
            return (row * column) + "";
        }
    }



    private JScrollPane getScrollPane() {
        if (scrollPane == null) {
            scrollPane = new JScrollPane();
            scrollPane.setViewportView(getTblData());
        }
        return scrollPane;
    }
    private JScrollPane getScrollPane_1() {
        if (scrollPane_1 == null) {
            scrollPane_1 = new JScrollPane();
            scrollPane_1.setViewportView(getTblFilter());
        }
        return scrollPane_1;
    }
}

貢獻Deepak之后更新了代碼 (我不知道如何顯示我的更新,因此在下面添加了)

我更新了代碼,現在在圖片上看到了兩個問題。 第二個表的標題不可見,並且表之間有很大的差距。

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
import java.awt.GridLayout;

public class CompFilteredTable extends JPanel{
    private JTable tblFilter;
    private JTable tblData;
    private JScrollPane scrollPane;
    private JPanel panel;

    public CompFilteredTable() {
        setLayout(new BorderLayout(0, 0));
        add(getScrollPane(), BorderLayout.CENTER);
    }


    public JTable getTblFilter() {
        if (tblFilter == null) {
            tblFilter = new MyTable(new TestTableModel2());
            tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            tblFilter.setTableHeader (null);
        }
        return tblFilter;
    }
    public JTable getTblData() {
        if (tblData == null) {
            tblData = new MyTable(new TestTableModel());
            tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

            tblFilter.setColumnModel(tblData.getColumnModel());
        }   
        return tblData;
    }

    private class MyTable extends JTable {
        private MyTable (final TableModel model) {
            super (model);
        }

        private boolean isColumnMarginChangeInProgress=false;
        @Override
        public void columnMarginChanged(final ChangeEvent e) {
            if (isColumnMarginChangeInProgress) {
                return;
            }
            isColumnMarginChangeInProgress = true;

            if (isEditing()) {
                removeEditor();
            }
            TableColumn resizingColumn = null;
            if (tableHeader != null) {
                resizingColumn = tableHeader.getResizingColumn();
            }
            if (resizingColumn != null) {
                if (autoResizeMode == AUTO_RESIZE_OFF) {
                    resizingColumn.setPreferredWidth(resizingColumn.getWidth());
                } else {    // this else block is missing in jdk1.4 as compared to 1.3
                    doLayout();
                }
                repaint();
            } else {
                resizeAndRepaint();
            }
            isColumnMarginChangeInProgress = false;
        }
    }



    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(600, 400));

        CompFilteredTable compFilteredTable = new CompFilteredTable();

        frame.getContentPane().add(compFilteredTable);
        frame.pack();
        frame.setVisible(true);

    }

    private class TestTableModel extends DefaultTableModel {
        @Override
        public int getRowCount () {
            return 10;
        }
        @Override
        public int getColumnCount () {
            return 10;
        }
        @Override
        public String getColumnName (final int column) {
            return "Col-"+column;
        }

        @Override
        public Object getValueAt (final int row, final int column) {
            return (row * column) + "";
        }
    }

    private class TestTableModel2 extends DefaultTableModel {
        @Override
        public int getRowCount () {
            return 1;
        }
        @Override
        public int getColumnCount () {
            return 10;
        }
        @Override
        public String getColumnName (final int column) {
            return "Col-"+column;
        }

        @Override
        public Object getValueAt (final int row, final int column) {
            return (row * column) + "";
        }
    }

    private JScrollPane getScrollPane() {
        if (scrollPane == null) {
            scrollPane = new JScrollPane();
            scrollPane.setViewportView(getPanel());
        }
        return scrollPane;
    }

    private JPanel getPanel() {
        if (panel == null) {
            panel = new JPanel();
            panel.setLayout(new GridLayout(2, 1, 0, 0));
            panel.add(getTblFilter());
            panel.add(getTblData());
        }
        return panel;
    }

}

輸出畫面

表輸出

使用columnMarginChanged事件上的setPreferredWidth方法設置TableColumn的首選寬度將更新JTableHeader組件。 因此,表頭的大小正在按觀察到的方式調整。 設置所需的屬性后,顯式調用repaint()也會觸發將更改應用於表的每個組件。

因此,這里是進行此更改以使其達到預期效果所需的更改。

            if (autoResizeMode == AUTO_RESIZE_OFF) {
                resizingColumn.setPreferredWidth(resizingColumn.getWidth());
                repaint();
            } else {    // this else block is missing in jdk1.4 as compared to 1.3

同樣, repaint()也可以移出條件塊。

問題1:看不到第二個表的標題。

原因:如表中的代碼所示,表頭被設置為null

    public JTable getTblFilter() {
        if (tblFilter == null) {
            tblFilter = new MyTable(new TestTableModel2());
            tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            tblFilter.setTableHeader (null);
        }
        return tblFilter;
    }

解決方案是不要將表頭設置為null。 刪除部分代碼tblFilter.setTableHeader (null); 應該管用。

問題2:表格之間的差距很大。

有各種可用的LayoutManager,可用於根據需要設計UI。 在這里使用帶有2行1列的GridLayout應該會有所幫助。

    public CompFilteredTable() {
        setLayout(new GridLayout(2, 1));
        add(getScrollPane_1());
        add(getScrollPane());
    }

這是工作程序

可以將單個JTable添加到單個JScrollPane中,以解決表頭未在UI中顯示的問題。

要管理表之間的間隙,GridBagLayout會有所幫助。 GridBagLayout是最靈活的布局管理器類。GridBagLayout的對象使組件垂直,水平或沿其基線對齊, 而不需要相同大小的組件。

我解決了所有問題,表格之間有一些縫隙。 我想將此組件用作根據上表中的值過濾表的組件。 這個組件有什么改進嗎? 也許可以將過濾功能添加到此組件中。

組件的輸出屏幕:

過濾表

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

public class CompFilteredTable extends JPanel{
    private JTable tblFilter;
    private JTable tblData;
    private JScrollPane scrollPane;
    private JPanel panel;
    private JScrollPane scrollPane_1;
    private JScrollPane scrollPane_2;

    public CompFilteredTable() {
        setLayout(new BorderLayout(0, 0));
        add(getScrollPane(), BorderLayout.CENTER);
    }


    public JTable getTblFilter() {
        if (tblFilter == null) {
            tblFilter = new FilteredTable(new TestTableModel2());
            tblFilter.setPreferredScrollableViewportSize(new Dimension(0, 0));
            tblFilter.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            tblFilter.setTableHeader (null);

        }
        return tblFilter;
    }
    public JTable getTblData() {
        if (tblData == null) {
            tblData = new FilteredTable(new TestTableModel());
            tblData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

            tblFilter.setColumnModel(tblData.getColumnModel());
        }   
        return tblData;
    }


    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(600, 400));

        CompFilteredTable compFilteredTable = new CompFilteredTable();

        frame.getContentPane().add(compFilteredTable);
        frame.pack();
        frame.setVisible(true);

    }

    private class TestTableModel extends DefaultTableModel {
        @Override
        public int getRowCount () {
            return 10;
        }
        @Override
        public int getColumnCount () {
            return 10;
        }
        @Override
        public String getColumnName (final int column) {
            return "Col-"+column;
        }

        @Override
        public Object getValueAt (final int row, final int column) {
            return (row * column) + "";
        }
    }

    private class TestTableModel2 extends DefaultTableModel {
        @Override
        public int getRowCount () {
            return 1;
        }
        @Override
        public int getColumnCount () {
            return 10;
        }
        @Override
        public String getColumnName (final int column) {
            return "Col-"+column;
        }

        @Override
        public Object getValueAt (final int row, final int column) {
            return (row * column) + "";
        }
    }

    private JScrollPane getScrollPane() {
        if (scrollPane == null) {
            scrollPane = new JScrollPane();
            scrollPane.setViewportView(getPanel());
        }
        return scrollPane;
    }

    private JPanel getPanel() {
        if (panel == null) {
            panel = new JPanel();
            panel.setLayout(new BorderLayout(0, 0));
            panel.add(getScrollPane_2(), BorderLayout.NORTH);
            panel.add(getScrollPane_1());
        }
        return panel;
    }



    private JScrollPane getScrollPane_1() {
        if (scrollPane_1 == null) {
            scrollPane_1 = new JScrollPane();
            scrollPane_1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
            scrollPane_1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            scrollPane_1.setViewportView(getTblData());
            Dimension d = tblData.getPreferredSize();
            scrollPane_1.setPreferredSize(new Dimension(d.width,tblData.getRowHeight()*tblData.getRowCount()+1));

        }
        return scrollPane_1;
    }
    private JScrollPane getScrollPane_2() {
        if (scrollPane_2 == null) {
            scrollPane_2 = new JScrollPane();
            scrollPane_2.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            scrollPane_2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
            scrollPane_2.setViewportView(getTblFilter());
            Dimension d = tblFilter.getPreferredSize();
            scrollPane_2.setPreferredSize(new Dimension(d.width,tblFilter.getRowHeight()*tblFilter.getRowCount()+1));

        }
        return scrollPane_2;
    }
}

class FilteredTable extends JTable {

    FilteredTable (final TableModel model) {
        super (model);
    }

    private boolean isColumnMarginChangeInProgress=false;
    @Override
    public void columnMarginChanged(final ChangeEvent e) {
        if (isColumnMarginChangeInProgress) {
            return;
        }
        isColumnMarginChangeInProgress = true;

        if (isEditing()) {
            removeEditor();
        }
        TableColumn resizingColumn = null;
        if (tableHeader != null) {
            resizingColumn = tableHeader.getResizingColumn();
        }
        if (resizingColumn != null) {
            if (autoResizeMode == AUTO_RESIZE_OFF) {
                resizingColumn.setPreferredWidth(resizingColumn.getWidth());
            } else {    // this else block is missing in jdk1.4 as compared to 1.3
                doLayout();
            }
            repaint();
        } else {
            resizeAndRepaint();
        }
        isColumnMarginChangeInProgress = false;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM