【问题标题】:JTable - align components under the columnsJTable - 在列下对齐组件
【发布时间】:2012-07-31 11:12:21
【问题描述】:

在 JTable 的特定列下对齐其他组件(例如按钮、标签等)的方法是什么?例如,我想在带有复选框的列下添加另一个复选框,它将选择该特定列中的所有值。

【问题讨论】:

  • 你想把 JComponent 放在 JTable 下,用当前列 wight 调整它们,并用列调整大小或重新排序来调整它们的大小???
  • 我想把它们放在列的正下方,并通过调整列的大小来调整它们的大小

标签: java swing jtable


【解决方案1】:

据我了解,TableColumnModelListener 的用法,以及来自调整大小和重新排序的适当事件

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TableFilterRow extends JFrame implements TableColumnModelListener {

    private static final long serialVersionUID = 1L;
    private JTable table;
    private JPanel filterRow;   // Panel for text fields

    public TableFilterRow() {
        table = new JTable(3, 5);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane);
        table.getColumnModel().addColumnModelListener(this);
        filterRow = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
        for (int i = 0; i < table.getColumnCount(); i++) {
            filterRow.add(new JTextField(" Sum at - " + i));
        }
        columnMarginChanged(new ChangeEvent(table.getColumnModel()));
        getContentPane().add(filterRow, BorderLayout.SOUTH);
    }

    //  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();

        for (int i = 0; i < columns; i++) {
            JTextField textField = (JTextField) filterRow.getComponent(i);
            Dimension d = textField.getPreferredSize();
            d.width = tcm.getColumn(i).getWidth();
            textField.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) {
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new TableFilterRow();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

【讨论】:

  • 从未问过,从未知晓 :-)
【解决方案2】:

JTable 中的单元格对齐方式取决于 Componentrender 单元格的对齐方式。对于普通单元格使用,DefaultTableCellRenderer是一个JLabel,支持全面的对齐属性;一个例子是看到here。要在表格标题单元格中使用,您应该首先考虑引用 here 的注意事项。一旦确定需要这样的组件,这个example 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2011-03-28
    • 2016-04-28
    • 2012-07-31
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多