TableColumnModelListener. JPanel revalidate()方法破坏了摆动元素的组成 [英] TableColumnModelListener. JPanel revalidate() method ruins swing elements composition

查看:80
本文介绍了TableColumnModelListener. JPanel revalidate()方法破坏了摆动元素的组成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题描述:

最初有两个表:

在左表的顶部有两个元素:JTextField和JComboBox,它们被放在一个单独的JPanel中.这两个元素对于表筛选都是必需的,即更改选定的组合框元素或在左侧的JTextField get表中键入某些内容以过滤掉.

At the top of the left table there are two elements: JTextField and JComboBox, which are put into one separate JPanel. These two elementes are needed for the table filtering purposes, that is, changing selected combo box element or typing something in the JTextField get table on the left filtered out.

我试图实现TableColumnModelListener接口,以便将JTextField和JComboBox元素连接到表.结果并没有我预期的那么好:revalidate()方法调用JPanel容器对象uppon破坏了整个swing元素的组合.下图显示了该实验的结果:

I tried to implement TableColumnModelListener interface in order to connect JTextField and JComboBox elements to the table. The result was not so good as I expected: the revalidate() method called uppon the JPanel container object ruined whole swing elements composition. The outcome of this experiment is showed in the following picture:

源代码:

TablesTest类:

TablesTest class:

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class TablesTest {
    private JFrame frame = new JFrame();

    private javax.swing.JPanel commonTablesPanel;
    private javax.swing.JPanel dataTable1Panel;
    private javax.swing.JPanel dataTable2Panel;
    private javax.swing.JTable datatable1Table;
    private javax.swing.JTable datatable2Table;
    private javax.swing.JComboBox filterComboBox;
    private javax.swing.JPanel filterPanel;
    private javax.swing.JTextField filterTextField;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;

    private TableResizeListener tableResizeListener1;

    public TablesTest() {
        java.awt.GridBagConstraints gridBagConstraints;

        commonTablesPanel = new javax.swing.JPanel();
        dataTable1Panel = new javax.swing.JPanel();
        filterPanel = new javax.swing.JPanel();
        filterTextField = new javax.swing.JTextField();
        filterComboBox = new javax.swing.JComboBox();
        jScrollPane3 = new javax.swing.JScrollPane();
        datatable1Table = new javax.swing.JTable();
        dataTable2Panel = new javax.swing.JPanel();
        jScrollPane4 = new javax.swing.JScrollPane();
        datatable2Table = new javax.swing.JTable();

        frame.setLayout(new java.awt.GridBagLayout());

        commonTablesPanel.setMinimumSize(new java.awt.Dimension(30, 30));
        commonTablesPanel.setPreferredSize(new java.awt.Dimension(30, 30));
        commonTablesPanel.setLayout(new java.awt.GridBagLayout());

        dataTable1Panel.setLayout(new java.awt.GridBagLayout());

        filterPanel.setLayout(new java.awt.GridBagLayout());

        filterTextField.setPreferredSize(new java.awt.Dimension(30, 20));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        filterPanel.add(filterTextField, gridBagConstraints);

        filterComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        filterComboBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                //TODO
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        filterPanel.add(filterComboBox, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        dataTable1Panel.add(filterPanel, gridBagConstraints);

        jScrollPane3.setPreferredSize(new java.awt.Dimension(30, 30));

        datatable1Table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null}
            },
            new String [] {
                "Title 1", "Titile 2"
            }
        ));
        datatable1Table.setMinimumSize(new java.awt.Dimension(30, 30));
        jScrollPane3.setViewportView(datatable1Table);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.weighty = 0.1;
        dataTable1Panel.add(jScrollPane3, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.weighty = 0.1;
        commonTablesPanel.add(dataTable1Panel, gridBagConstraints);

        dataTable2Panel.setLayout(new java.awt.GridBagLayout());

        jScrollPane4.setPreferredSize(new java.awt.Dimension(30, 30));

        datatable2Table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null},
                {null, null}
            },
            new String [] {
                "Titile 1", "Title 2"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        datatable2Table.setMinimumSize(new java.awt.Dimension(30, 30));
        jScrollPane4.setViewportView(datatable2Table);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.weighty = 0.1;
        dataTable2Panel.add(jScrollPane4, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.weighty = 0.1;
        commonTablesPanel.add(dataTable2Panel, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.weighty = 0.1;
        gridBagConstraints.insets = new java.awt.Insets(4, 4, 0, 4);
        frame.add(commonTablesPanel, gridBagConstraints);

        tableResizeListener1 = new TableResizeListener(datatable1Table, filterPanel);

        frame.setPreferredSize(new Dimension(400,150));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TablesTest tableTest = new TablesTest();
            }
        });
    }
}

通知

tableResizeListener1 = new TableResizeListener(datatable1Table, filterPanel);

部分.这是所有表列都连接到对应的JPanel元素(在此示例中为JTextField和JComboBox)的地方.如果要观察没有连接元素的构图的外观,可以注释掉该行.

part. This is where all table columns get connected to the corresponding JPanel elements (JTextField and JComboBox in this example). You can comment this line out if you want to observe how does the composition look like without connected elements.

TableResizeListener类.这就是问题所在.

TableResizeListener class. This is where the problem lurks.

import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.table.TableColumnModel;

public class TableResizeListener implements TableColumnModelListener {
    private static final long serialVersionUID = 1L;
    private JTable table = null;

    private JPanel filterRow = null;



    public TableResizeListener(JTable table, JPanel filterRow) {
        this.table = table;
        this.filterRow = filterRow;

        this.table.getColumnModel().addColumnModelListener(this);

        columnMarginChanged(new ChangeEvent(table.getColumnModel()));
    }

    //  Implement TableColumnModelListener methods
    //  (Note: instead of implementing a listener you should be able to
    //  override the columnMarginChanged and columMoved methods of JTable)
    @Override
    public void columnMarginChanged(ChangeEvent e) {
        TableColumnModel tcm = table.getColumnModel();
        int columns = tcm.getColumnCount();

        if(columns == filterRow.getComponentCount()) {
            for (int i = 0; i < columns; i++) {
                Component comp = filterRow.getComponent(i);
                Dimension d = comp.getPreferredSize();
                d.width = tcm.getColumn(i).getWidth();
                comp.setPreferredSize(d);
            }

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    filterRow.revalidate();
                }
            });
        }
    }

    @Override
    public void columnMoved(TableColumnModelEvent e) {
        Component moved = filterRow.getComponent(e.getFromIndex());
        filterRow.remove(e.getFromIndex());
        filterRow.add(moved, e.getToIndex());
        filterRow.validate();
    }

    @Override
    public void columnAdded(TableColumnModelEvent e) {
    }

    @Override
    public void columnRemoved(TableColumnModelEvent e) {
    }

    @Override
    public void columnSelectionChanged(ListSelectionEvent e) {
    }
}

filterRow.revalidate();

负责此错误.我试图调用repaint(),validate(),但是它并没有带来如此流畅的视觉体验.

is responsible for this bug. I tried to call repaint(), validate(), however it resulted in not such a smooth visual experience.

如何在不破坏视觉外观的情况下将元素连接到JTable的外部?

How can I connect elements to the outside of the JTable without ruining my visual composition?

推荐答案

注释此行以解决您的问题.

Comment this line out to fix your problem.

jScrollPane4.setPreferredSize(new java.awt.Dimension(30, 30));

这篇关于TableColumnModelListener. JPanel revalidate()方法破坏了摆动元素的组成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆