【问题标题】:How can i create two Jtables which have same Columnmodel, but they have different models如何创建两个具有相同 Columnmodel 的 Jtable,但它们具有不同的模型
【发布时间】:2015-10-02 06:49:48
【问题描述】:

我设计了两个具有相同 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;
    }

}

输出画面

【问题讨论】:

    标签: java swing jtable jpanel jscrollpane


    【解决方案1】:

    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() 也可以移出条件块。

    【讨论】:

      【解决方案2】:

      问题一:第二个表的表头没有看到。

      原因:表头设置为null,如发布的代码所示。

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

      解决方法是不要将表头设置为空。删除部分代码 tblFilter.setTableHeader (null); 应该可以工作。

      问题2:表格之间有很大的差距。

      有不同的 LayoutManager 可用,可用于根据您的需要设计 UI。在这里使用 2 行 1 列的 GridLayout 应该会有所帮助。

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

      【讨论】:

      • 我更新了代码,我添加了一个包含两个 jtables 的 jpanel。对于第一个 jtable,我不想显示标题,因为我将它用作过滤下表的文本字段。更新后的代码只有一个jscrollpane
      【解决方案3】:

      单个 JTable 可以添加到单个 JScrollPane 中,以解决 UI 中不显示表头的问题。

      要管理表格之间的间隙,GridBagLayout 可以提供帮助。 GridBagLayout 是最灵活的布局管理器类。GridBagLayout 对象垂直、水平或沿基线对齐组件不需要相同大小的组件。

      【讨论】:

        【解决方案4】:

        我解决了我所有的问题,桌子之间有一点差距。我想将其用作根据上表中的值过滤表的组件。这个组件有什么改进吗?或许过滤后的功能可以添加到这个组件中。

        组件的输出画面:

        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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-22
          • 1970-01-01
          • 1970-01-01
          • 2023-02-14
          • 1970-01-01
          • 2020-06-10
          • 1970-01-01
          • 2014-04-09
          相关资源
          最近更新 更多