Java Swing |расширить AbstractTableModel и использовать его с JTable |несколько вопросов - PullRequest
0 голосов
/ 29 ноября 2010

Я следовал модели Oracle для реализации AbstractTableModel

http://download.oracle.com/javase/tutorial/uiswing/examples/components/TableDemoProject/src/components/TableDemo.java

Я сделал это, потому что моя таблица должна содержать 3 столбца, а первым должен быть JCheckBox.

Вот мой код:

public class FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel extends AbstractTableModel {
private String[] columnNames = {"Auswahl",
                                    "Dateiname",
                                    "Pfad"};
    private Object[][] data = {
    {new Boolean(true), "datei.tmp",
     "/home/user/tmp"}
    };

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

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

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

     public boolean isCellEditable(int row, int col) {
        if (col == 0) {
            return true;
        } else {
            return false;
        }
    }

     public void setValueAt(Object value, int row, int col) {            
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

}

Вот мои вопросы:

  1. Как JTable (new JTable(FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel)) узнает, что такое имена столбцов и их значения? Так как в моем AbstractTableModel нет конструктора ?! Это потому, что columnNames и данные должны быть названы так, как они есть, и JTable обращается к ним?
  2. Как я могу поместить новые значения в JTable? Так как columnNames и data являются массивами. Могу ли я заменить их векторами? Если так, как я могу инициировать эти векторы? В конструкторе в myAbsTableModel?

Я думаю, что очень легко найти решение, но эта обработка Таблицы не тривиальна для меня, так что большое спасибо!

Ответы [ 3 ]

2 голосов
/ 29 ноября 2010

Все компоненты Swing поставляются с реализациями модели по умолчанию.Я предлагаю вам понять, как их использовать, прежде чем пытаться создать свой собственный.Для JTable его называют DefaultTableModel.Прочитайте API для методов, чтобы динамически добавлять / удалять строки данных из модели.Вот простой пример для начала работы:

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableBasic extends JPanel
{
    public TableBasic()
    {
        String[] columnNames = {"Date", "String", "Integer", "Boolean"};

        Object[][] data =
        {
            {new Date(), "A", new Double(1), Boolean.TRUE },
            {new Date(), "B", new Double(2), Boolean.FALSE},
            {new Date(), "C", new Double(9), Boolean.TRUE },
            {new Date(), "D", new Double(4), Boolean.FALSE}
        };

        JTable table = new JTable(data, columnNames)
        {
            //  Returning the Class of each column will allow different
            //  renderers and editors to be used based on Class

            public Class getColumnClass(int column)
            {
                for (int row = 0; row < getRowCount(); row++)
                {
                    Object o = getValueAt(row, column);

                    if (o != null)
                        return o.getClass();
                }

                return Object.class;
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("TableBasic");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableBasic() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
0 голосов
/ 29 ноября 2010
  1. JTable определяет, сколько столбцов, вызывая getColumnCount () в вашей модели столбцов. Затем он выполняет итерацию и вызывает getColumnName (idx) для каждого столбца. Ваш класс сообщает ему имя столбца - посмотрите на реализацию этих методов.

  2. Вы можете хранить свои данные в любом формате, который вы хотите. JTable вызывает методы вашей табличной модели для извлечения этих данных. Если вы хотите добавить новые элементы в вашу модель, вы можете реализовать метод addItem (Object o) для вашей модели; просто обязательно вызовите fireTableRowsInserted () для каждого нового элемента.

0 голосов
/ 29 ноября 2010

Во-первых, я думаю, вам нужно узнать немного больше о Java, особенно о наследовании (я ссылаюсь на вашу проблему с конструктором.

Ответы на ваши вопросы:

  • определите имена столбцов с помощью атрибута private final static, при условии, что имена столбцов не изменятся.
  • поскольку ваш класс расширяет AbstractTableModel, вы можете определить для него конструктор, в который вы будете передавать данные. Переопределите метод getValueAt, чтобы позволить модели использовать передаваемые вами данные.

Еще несколько советов:

  • не делай того, что делаешь в getColumnClass. Обычно все элементы в столбце будут иметь один и тот же класс, поэтому для получения классов сделайте switch в индексе столбца.
  • чтобы добавить JCheckBox в один из столбцов, вам нужно будет использовать пользовательский TableCellRenderer
...