JTable добавляет строки снизу вверх - строки, добавленные одна за другой, должны отображаться внизу последней, но все должны быть выровнены снизу - PullRequest
0 голосов
/ 07 октября 2010

У меня есть свинг JTable в Java, который должен быть выровнен снизу.

Как и в обычных таблицах, когда строка добавляется в таблицу, она помещается сверху, при добавлении следующей строки она добавляетсяпод ним и т. д.

То, что я хотел бы сделать, это поместить новую строку в нижней части таблицы.Когда добавляется новая строка, я бы хотел, чтобы новая строка располагалась справа внизу, а предыдущая - вверх.Таким образом, строки выглядят движущимися вверх.В основном строки должны придерживаться дна.

Есть идеи, как это сделать?

Ответы [ 3 ]

1 голос
/ 06 января 2012

Вы можете использовать шаблон декоратора. Предполагая класс 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);
    }
}

}

Помните, что средство визуализации ячеек должно обрабатывать нулевое значение;)

Увидимся!

0 голосов
/ 07 октября 2010

Код ниже показывает один из способов сделать это с помощью JList. Это будет немного сложнее для JTable, так как вам понадобится вторая JPanel с BorderLayout. Вы добавили бы заголовок таблицы на север и главную панель в центр. Затем эта панель будет добавлена ​​в область просмотра или область прокрутки.

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 );
    }
}
0 голосов
/ 07 октября 2010

Если предположение @Geoffrey Zheng верное, вы можете создать таблицу с n пустыми строками (например, вектором n null), а затем заменить элементы в нужном вам порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...