JTable не отображает значения - PullRequest
1 голос
/ 22 апреля 2020

Я реализую GUI, используя java в Eclipse IDE. Я хочу отобразить таблицу. Вот как я реализую программу

import java.awt.EventQueue;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.text.TabableView;

import com.model.FloorDetails;

public class ClientGUI {

    private JFrame frame;
    private ClientMain clientMain = new ClientMain();
    private JTable table;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ClientGUI window = new ClientGUI();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public ClientGUI() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        table = new JTable();
        table.setBounds(67, 146, 1, 1);
        frame.getContentPane().add(table);
        executeTable();

    }

    public void executeTable() {
        Object[] columns = new String[] {
                "ID", "Room No", "Floor No", "CO2 Level", "Smoke Level", "Status"
        };


        ArrayList<FloorDetails> arrayList = clientMain.getSensors();

        Object[][] data = new Object[arrayList.size()][6];

        for(int i = 0; i < arrayList.size(); i++) {
            data[i][0] = arrayList.get(i).getId();
            data[i][1] = arrayList.get(i).getRoomNo();
            data[i][2] = arrayList.get(i).getFloorNo();
            data[i][3] = arrayList.get(i).getCo2Level();
            data[i][4] = arrayList.get(i).getSmokeLevel();
            data[i][5] = arrayList.get(i).getStatus();
        }

        table = new JTable(data,columns);
        frame.setTitle("Sensor Details");

    }

}

clientMain.getSensors(), метод извлекает все данные, как и ожидалось (я пробовал печатать на консоли и все печатать). Но когда я запускаю программу, она отображает пустое окно.

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

        Object[][] data = {
                {"a", "b", "c", "d", "e", "f"},
                {"g", "h", "i", "j", "k", "l"}
        };

Где я ошибся в этой программе? Спасибо заранее!

1 Ответ

2 голосов
/ 22 апреля 2020

Хорошо, одна проблема в вашем коде состоит в том, что вы заполняете одну таблицу и добавляете другую таблицу во фрейм. Один из способов исправить это будет

public JTable executeTable(  ) { // Make this method return a JTable
    Object[] columns = new String[] {
            "ID", "Room No", "Floor No", "CO2 Level", "Smoke Level", "Status"
    };

    ArrayList<FloorDetails> arrayList = clientMain.getSensors();

    Object[][] data = new Object[arrayList.size()][6];

    for(int i = 0; i < arrayList.size(); i++) {
        data[i][0] = arrayList.get(i).getId();
        data[i][1] = arrayList.get(i).getRoomNo();
        data[i][2] = arrayList.get(i).getFloorNo();
        data[i][3] = arrayList.get(i).getCo2Level();
        data[i][4] = arrayList.get(i).getSmokeLevel();
        data[i][5] = arrayList.get(i).getStatus();
    }

    table = new JTable( data, columns);
    return table;
}

, а затем изменить метод инициализации, чтобы использовать эту возвращенную таблицу

private void initialize() {
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    table = executeTable();
    frame.add(table.getTableHeader(), BorderLayout.PAGE_START);
    frame.add(table, BorderLayout.CENTER);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setTitle("Sensor Details");
    frame.setVisible(true);
}

Вам не нужно window.frame.setVisible(true); в методе main в этом подходе

...