JTable自下而上添加行 - 一个接一个地添加的行应该出现在最后一个的底部但是所有行都应该是底部对齐的

时间:2010-10-07 11:50:54

标签: java swing

我在Java swing中有一个需要底部对齐的JTable。

在普通表中,当一行被添加到表中时,它被放置在顶部,当添加下一行时,它被添加到它下面,依此类推。

我想要做的是将新行放在表格的底部。添加新行时,我希望新行位于底部,而前一行则向上移动。这样行似乎向上移动。 基本上行应该粘在底部。

任何想法如何做到这一点?

3 个答案:

答案 0 :(得分:1)

您可以使用装饰器模式。假设一个名为TableModelDecorator的类装饰了TableModel,您可以实现:

public class TableEmptyReverseRowsModel extends TableModelDecorator {

private int minimumRows;

public TableEmptyReverseRowsModel(final TableModel realModel, 
                            final int minimumRows) {
    super(realModel);

    this.minimumRows = minimumRows;
}

public int getRowCount() {
    int realCount = model.getRowCount();        
    return realCount < minimumRows ? minimumRows : realCount;
}


public boolean isCellEditable(int rowIndex, int columnIndex) {
    int diff = minimumRows - model.getRowCount();

    if (diff > 0) {
        if (rowIndex < diff) {
            return false;
        } else {
            return model.isCellEditable(rowIndex - diff, columnIndex);
        }
    } else {
        return model.isCellEditable(rowIndex, columnIndex);
    }
}

public Object getValueAt(int rowIndex, int columnIndex) {
    int diff = minimumRows - model.getRowCount();

    if (diff > 0) {
        if (rowIndex < diff) {
            return null;
        } else {
            return model.getValueAt(rowIndex - diff, columnIndex);
        }
    } else {
        return model.getValueAt(rowIndex, columnIndex);
    }
}

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    int diff = minimumRows - model.getRowCount();

    if (diff > 0) {
        if (rowIndex < diff) {

        } else {
            super.setValueAt(aValue, rowIndex - diff, columnIndex);
        }
    } else {
        super.setValueAt(aValue, rowIndex, columnIndex);
    }
}

}

请注意必须处理空值的单元格渲染器;)

见啊!

答案 1 :(得分:0)

如果@Geoffrey Zheng的假设是正确的,那么你可以创建一个n个空行的表,(例如n null的向量),然后替换元素按照你需要的顺序。

答案 2 :(得分:0)

下面的代码显示了使用JList执行此操作的一种方法。对于JTable来说会有点复杂,因为你需要第二个带有BorderLayout的JPanel。您可以将表头添加到North,将主面板添加到Center。然后,此面板将添加到视口或滚动窗格中。

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

public class ListBottom2 extends JFrame
{
    JList list;
    JTextField textField;

    public ListBottom2()
    {
        DefaultListModel model = new DefaultListModel();
        model.addElement("First");
        list = new JList(model);
        list.setVisibleRowCount(5);

        JPanel box = new JPanel( new BorderLayout() );
        box.setBackground( list.getBackground() );
        box.add(list, BorderLayout.SOUTH);

        JScrollPane scrollPane = new JScrollPane( box );
        scrollPane.setPreferredSize(new Dimension(200, 100));
        add( scrollPane );

        textField = new JTextField("Use Enter to Add");
        getContentPane().add(textField, BorderLayout.NORTH );
        textField.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JTextField textField = (JTextField)e.getSource();
                DefaultListModel model = (DefaultListModel)list.getModel();
                model.addElement( textField.getText() );
                int size = model.getSize() - 1;
                list.scrollRectToVisible( list.getCellBounds(size, size) );
                textField.setText("");
            }
        });
    }

    public static void main(String[] args)
    {
        ListBottom2 frame = new ListBottom2();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }
}