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