我在Java swing中有一个需要底部对齐的JTable。
在普通表中,当一行被添加到表中时,它被放置在顶部,当添加下一行时,它被添加到它下面,依此类推。
我想要做的是将新行放在表格的底部。添加新行时,我希望新行位于底部,而前一行则向上移动。这样行似乎向上移动。 基本上行应该粘在底部。
任何想法如何做到这一点?
答案 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 );
}
}