Java JTable add rows bottom up-一行接一行添加的行应显示在最后一行的底部,但所有行都应底部对齐

Java JTable add rows bottom up-一行接一行添加的行应显示在最后一行的底部,但所有行都应底部对齐,java,swing,Java,Swing,我在Java swing中有一个JTable,它需要底部对齐 与普通表一样,当一行添加到表中时,该行被置于顶部,当添加下一行时,该行被添加到其下方,依此类推 我想做的是将新行放在表的底部。当添加新行时,我希望新行位于底部的右侧,上一行向上移动。这样,行似乎向上移动。 基本上,这些行应该贴到底部 有什么办法吗?如果@Geoffrey Zheng的假设是正确的,那么您可以创建一个表,其中包含n空行(例如n

我在Java swing中有一个JTable,它需要底部对齐

与普通表一样,当一行添加到表中时,该行被置于顶部,当添加下一行时,该行被添加到其下方,依此类推

我想做的是将新行放在表的底部。当添加新行时,我希望新行位于底部的右侧,上一行向上移动。这样,行似乎向上移动。 基本上,这些行应该贴到底部


有什么办法吗?

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

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

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

您可以使用decorator模式。假设一个名为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);
    }
}

}
公共类TableEmptyReversorWSModel扩展了TableModelDecorator{
私有int最小行数;
公共表EmptyReverSerowsModel(最终表模型realModel,
最终整数最小值(行){
超级(realModel);
this.minimumRows=minimumRows;
}
public int getRowCount(){
int realCount=model.getRowCount();
返回realCount0){
if(行索引<差异){
返回false;
}否则{
返回模型.isCellEditable(rowIndex-diff,columnIndex);
}
}否则{
返回模型.isCellEditable(行索引、列索引);
}
}
公共对象getValueAt(int行索引、int列索引){
int diff=minimumRows-model.getRowCount();
如果(差异>0){
if(行索引<差异){
返回null;
}否则{
返回model.getValueAt(rowIndex-diff,columnIndex);
}
}否则{
返回model.getValueAt(rowIndex,columnIndex);
}
}
public void setValueAt(对象有效、int行索引、int列索引){
int diff=minimumRows-model.getRowCount();
如果(差异>0){
if(行索引<差异){
}否则{
super.setValueAt(aValue,rowIndex-diff,columnIndex);
}
}否则{
super.setValueAt(aValue、rowIndex、columnIndex);
}
}
}
请注意必须处理空值的单元格呈现程序;)


再见

您的意思是,如果表格标题和顶行没有一直推到顶部,您希望表格标题和顶行之间有空的空间吗?如果是这样,@Steve Jackson的答案将无法解决问题,您需要使用自定义表UI或使用第二个空表来显示标题,并使用布局管理器将数据表保留在底部。是的,我完全误解了这个问题。删除了我的答案。是的,这意味着表格框架中的所有行都应该位于底部。是否有一种简单的方法可以告诉行“底部对齐”到表框?请指出是否希望在表头和第一行之间留有空格,或者空行可以。如果是后者,请使用@tulskiy,我认为这与@Steve Jackson删除的一行相同:)我真的希望表格标题和第一行之间有空白。(就像在普通表中一样,最后一行和表底边框之间有空白)。但如果这不可能,我会同意@tulskiy的答案。