использование JTables с netbeans 6.1 или Матиссом - PullRequest
1 голос
/ 20 сентября 2008

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

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

Ответы [ 4 ]

2 голосов
/ 20 сентября 2008

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

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

1 голос
/ 20 сентября 2008

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

Ниже приведен пример сброса данных из 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();
    }
}

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

0 голосов
/ 22 октября 2008

Просто дополнение к посту 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, ты не представляешь, как я благодарен!

0 голосов
/ 20 сентября 2008

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

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

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