Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Скролируемый набор компонентов


Автор: engineer.dev 24.9.2009, 17:51
Имеется компонент который может по клику меняет свой размер, в нем так же есть JTextPane в котором обязательно надо иметь возможность скроллить содержимое.
Есть довольно большой набор данных, одним элементом данных заполняется одна компонента.
Проблема: если создавать на все данные сразу все компоненты, то это очень сильно нагружает систему и окно с компонентами довольно надолго подвисает, что не есть гуд.
JList не получается, т.к. все внутренние компоненты должны быть интерактивны.
Какие могут быть варианты для создания шустрого компонента?

Автор: duk 25.9.2009, 13:27
Вообще, для отображения компонент в списках и таблицах, можно использовать свой Renderer. 
Существует класс DefaultCellEditor:

Код

    DefaultCellEditor(JCheckBox checkBox)
          Constructs a DefaultCellEditor object that uses a check box.
    DefaultCellEditor(JComboBox comboBox)
          Constructs a DefaultCellEditor object that uses a combo box.
    DefaultCellEditor(JTextField textField)
          Constructs a DefaultCellEditor that uses a text field
.

Через него в таблице можно отображать чекбоксы, комбобоксы и поля ввода.

Пример:

Код

import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class EditableTable {

    public static void main(String[] a) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String[] columnTitles = { "Combo", "Check" };
        Object[][] dataSet = { { "2", new Boolean(false) },
                { "3", new Boolean(true) }, { "5", new Boolean(false) },
                { "4", new Boolean(true) } };

        TableModel model = new MyTableModel(columnTitles, dataSet);
        JTable table = new JTable(model);
        table.createDefaultColumnsFromModel();

        String[] bloodGroups = { "1", "2", "3", "4", "5" };
        JComboBox comboBox = new JComboBox(bloodGroups);
        table.getColumnModel().getColumn(0).setCellEditor(
                new DefaultCellEditor(comboBox));

        JCheckBox yearsCheckBox = new JCheckBox();
        table.getColumnModel().getColumn(1).setCellEditor(
                new DefaultCellEditor(yearsCheckBox));

        frame.add(new JScrollPane(table));

        frame.setSize(300, 200);
        frame.setVisible(true);
    }

}

class MyTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 6426795960468062652L;
    private String[] columnTitles;
    private Object[][] dataEntries;

    public MyTableModel(String[] columnTitles, Object[][] dataEntries) {
        this.columnTitles = columnTitles;
        this.dataEntries = dataEntries;
    }

    public int getRowCount() {
        return dataEntries.length;
    }

    public int getColumnCount() {
        return columnTitles.length;
    }

    public Object getValueAt(int row, int column) {
        return dataEntries[row][column];
    }

    public String getColumnName(int column) {
        return columnTitles[column];
    }

    public Class<?> getColumnClass(int column) {
        return getValueAt(0, column).getClass();
    }

    public boolean isCellEditable(int row, int column) {
        return true;
    }

    public void setValueAt(Object value, int row, int column) {
        dataEntries[row][column] = value;
    }
}

Автор: engineer.dev 25.9.2009, 14:53
Мне такой вариант не подойдет, у меня сложная разворачивающаяся компонента, с JTextPane'ом и скролом. Рендерер не позволяет использовать эти компоненты, на то он и рендерер, чтоб только отрисовывать. JTable не подойдет т.к. напихивание в него каких-то очень легких одиночных компонентов не интересно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)