Использование JTables с netbeans 6.1, также известного как Matisse

Прежде чем вы ответите: Да, я прочитал руководство по jtable на Sun. Нет, мне это не помогло. Да я идиот. Пожалуйста, не отвечайте со ссылкой на этот документ. Что меня особенно интересует, так это то, как динамически добавлять строки и столбцы в мою Jtable через IDE Netbeans. У меня уже есть объект, содержащий хэш-карту с моими данными. Я не могу понять, куда или какому объекту я должен передать этот объект. Спасибо за ваше время!

У меня есть вектор, содержащий серию (длиной l) объектов (каждый соответствует строке). Как мне получить этот векторный объект для отображения в JTable?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
6 995
4

Ответы 4

JTable использует TableModel для хранения данных. Ваш хэш / вектор данных необходимо будет адаптировать для использования; вы можете написать реализацию TableModel, используя хэш / вектор в качестве резервных данных, или, если вы не будете динамически обновлять хэш / вектор и вам нужно, чтобы он отображался автоматически, вы можете просто скопировать все в экземпляр DefaultTableModel и использовать который.

Если вы используете адаптер и динамически обновляете хэш / вектор, помните, что все обновления должны выполняться в потоке отправки событий. :-)

И убедитесь, что если вы изменяете столбцы / строки, модель правильно запускает события изменения модели, иначе вы не увидите никаких обновлений в таблице.

John Gardner 20.09.2008 04:23

Чтобы добавить к моему предыдущему ответу, чего бы это ни стоило, я на самом деле написал модель таблицы, которая использует (по сути) ArrayList<Row> в качестве резервных данных, где Row - это HashMap<String, Object>, сопоставляя имена столбцов со значениями.

Все это составляет около 1500 строк кода, хотя мой код может быть излишним для ваших целей, и вам, вероятно, не придется писать почти столько же кода. Всего наилучшего!

Для иллюстрации ниже приведены примеры использования DefaultTableModel для отображения данных с HashMap и Vector.

Ниже приведен пример сброса данных с HashMap на DefaultTableModel, который используется в качестве TableModel для JTable.

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

public class JTableExample extends JFrame
{
    private void makeGUI()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // HashMap with some data.
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("key1", "value1");
        map.put("key2", "value2");

        // Create a DefaultTableModel, which will be used as the
        // model for the JTable.
        DefaultTableModel model = new DefaultTableModel();

        // Populate the model with data from HashMap.
        model.setColumnIdentifiers(new String[] {"key", "value"});

        for (String key : map.keySet())
            model.addRow(new Object[] {key, map.get(key)});

        // Make a JTable, using the DefaultTableModel we just made
        // as its model.
        JTable table = new JTable(model);

        this.getContentPane().add(table);
        this.setSize(200,200);
        this.setLocation(200,200);
        this.validate();
        this.setVisible(true);
    }

    public static void main(String[] args)
    {
        new JTableExample().makeGUI();
    }
}

Для использования Vector для включения столбца данных в JTable:

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

public class JTableExample extends JFrame
{
    private void makeGUI()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Vector with data.
        Vector<String> v = new Vector<String>();
        v.add("first");
        v.add("second");

        // Create a DefaultTableModel, which will be used as the
        // model for the JTable.
        DefaultTableModel model = new DefaultTableModel();

        // Add a column of data from Vector into the model.
        model.addColumn("data", v);

        // Make a JTable, using the DefaultTableModel we just made
        // as its model.
        JTable table = new JTable(model);

        this.getContentPane().add(table);
        this.setSize(200,200);
        this.setLocation(200,200);
        this.validate();
        this.setVisible(true);
    }

    public static void main(String[] args)
    {
        new JTableExample().makeGUI();
    }
}

Я должен признать, что имена столбцов не отображаются при использовании приведенных выше примеров (я обычно использую метод DefaultTableModelsetDataVector), поэтому, если у кого-то есть предложения о том, как сделать так, чтобы имена столбцов отображались, пожалуйста, сделайте :)

Просто дополнение к сообщению coobird; чтобы появился заголовок, я сделал следующее:

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

public class JTableExample extends JFrame
{
    private void makeGUI()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // HashMap with some data.
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("key1", "value1");
        map.put("key2", "value2");

        // Create a DefaultTableModel, which will be used as the
        // model for the JTable.
        DefaultTableModel model = new DefaultTableModel();

        // Populate the model with data from HashMap.
        model.setColumnIdentifiers(new String[] {"key", "value"});

        for (String key : map.keySet())
                model.addRow(new Object[] {key, map.get(key)});

        // Make a JTable, using the DefaultTableModel we just made
        // as its model.
        JTable table = new JTable(model);

        this.getContentPane().add(new JScrollPane(table));
        this.setSize(200,200);
        this.setLocation(200,200);
        this.validate();
        this.setVisible(true);
    }

    public static void main(String[] args)
    {
        new JTableExample().makeGUI();
    }
}

Кстати, твой пост был мне очень полезен, coobird, ты даже не представляешь, как я благодарен!

Другие вопросы по теме