Nano Hash - криптовалюты, майнинг, программирование

Альтернативы конструктору JTable

Потратив бесчисленное количество часов на работу со Swing и стараясь изо всех сил учиться, я столкнулся с этой проблемой. Прежде чем перейти к конкретной проблеме, я хотел бы дать краткое изложение ситуации. Не стесняйтесь пропустить это, если вы сразу заметили проблему.

Я провел последние 3 дня, работая с JTables (или, по крайней мере, пытаясь). У меня есть пара проблем с конструктором JTable:

JTable(Object[][] rowData, Object[] columnNames)

Прочитав и перечитав документацию Oracle, я наткнулся на набор пунктов относительно конструктора JTable (минусы его использования):

  • Они автоматически делают каждую ячейку редактируемой.

  • Они обрабатывают все типы данных одинаково (как строки). Например, если столбец таблицы содержит логические данные, таблица может отображать данные в виде флажка. Однако, если вы используете один из двух конструкторов JTable, перечисленных ранее, ваши логические данные отображаются в виде строки. Вы можете увидеть эту разницу в колонке «Вегетарианство» на предыдущем рисунке.

  • Они требуют, чтобы вы поместили все данные таблицы в массив или вектор, что может не подходить для некоторых данных. Например, если вы создаете экземпляр набора объектов из базы данных, вам может потребоваться напрямую запрашивать у объектов их значения, а не копировать все их значения в массив или вектор.

И первый, и третий пункты вызывают у меня вопросы, поэтому я хотел бы задать несколько вопросов:

  1. Как я могу сделать ширину отдельного столбца статической, прямо сейчас, все ширины столбцов четные и равномерно масштабируются при изменении размера. Это проблема, поскольку столбец «ID» явно не требует столько места, сколько столбец «Электронная почта».

  2. У меня также возникла проблема с отображением имен столбцов по какой-то странной причине, когда мои имена столбцов String[] были переданы в конструктор, но в фрейме ничего не отображается.


Код JTable:

private JTable addStudentsJTable(){
    String[] columnNames = {
            "Teacher ID",
            "Student ID",
            "Name",
            "Surname",
            "E-mail",
            "Date of Birth",
            "Telephone",
            "Course",
            "OOP",
            "Year of Membership",
            "Consent"};

    Object[][] data = {
            {1, 1, "Random", "Student", "[email protected]", "1/1/1970", 9999999, "MC", true, 2014, true},
            {2, 2, "Student", "Surname", "[email protected]", "1/1/1970", 11111111, "AIO", true, 2000, true}
    };
    studentsJTable = new JTable(data, columnNames);

    studentsJTable.setPreferredScrollableViewportSize(new Dimension(850,200));
    studentsJTable.setFillsViewportHeight(true);

    JScrollPane scrollPane = new JScrollPane(studentsJTable);
    add(scrollPane);
    return studentsJTable;
}

Весь класс JFrame:

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableModel;
import java.awt.*;

public class JDatabaseMainFrame extends JFrame {
    private JTable studentsJTable;
    private JPanel contentPane;

public JDatabaseMainFrame(){
    JFrame frame = new JFrame("JDatabase");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setTitle("JDatabase");
    setResizable(true);
    setMinimumSize(new Dimension(850,350));

    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(new CardLayout(0, 0));

    //Adding tabs
    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.LEFT);
    contentPane.add(tabbedPane, "Tabs");

    //Adding Student's panel
    JPanel studentsPanel = new JPanel();
    tabbedPane.addTab("Students", null, studentsPanel, null);
    studentsPanel.setLayout(new BorderLayout(0, 0));

    //Adding JTable to Student's panel
    JTable studentsJTable = addStudentsJTable();
    studentsPanel.add(studentsJTable, BorderLayout.CENTER);

    //Adding Teacher's panel
    JPanel teachersPanel = new JPanel();
    tabbedPane.addTab("Teachers", null, teachersPanel, null);

    //Adding Outing's panel
    JPanel outingsPanel = new JPanel();
    tabbedPane.addTab("Outings", null, outingsPanel, null);

    setBounds(200,200,650,650);
    pack();
    setVisible(true);
}

private void printData(JTable jTable){
    int numberOfRows = jTable.getRowCount();
    int numberOfColumns = jTable.getColumnCount();

    TableModel model = jTable.getModel();

    for(int i = 0; i < numberOfRows; i++){
        System.out.println("Row: " + i + ":");
        for(int j = 0; j < numberOfColumns; j++){
            System.out.println("  " + model.getValueAt(i, j));
        }
        System.out.println();
    }
    System.out.println("-------------------------------");
}

private JTable addStudentsJTable(){
    String[] columnNames = {
            "Teacher ID",
            "Student ID",
            "Name",
            "Surname",
            "E-mail",
            "Date of Birth",
            "Telephone",
            "Course",
            "OOP",
            "Year of Membership",
            "Consent"};

    Object[][] data = {
            {1, 1, "Random", "Student", "[email protected]", "1/1/1970", 9999999, "MC", true, 2014, true},
            {2, 2, "Student", "Surname", "[email protected]", "1/1/1970", 11111111, "AIO", true, 2000, true}
    };
    studentsJTable = new JTable(data, columnNames);

    studentsJTable.setPreferredScrollableViewportSize(new Dimension(850,200));
    studentsJTable.setFillsViewportHeight(true);

    JScrollPane scrollPane = new JScrollPane(studentsJTable);
    add(scrollPane);
    return studentsJTable;
}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JDatabaseMainFrame frame = new JDatabaseMainFrame();
            frame.setVisible(true);
        }
    });
}
}

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

13.08.2014

Ответы:


1

Вам следует настроить пользовательскую TableModel, чтобы вы могли использовать любые структуры данных вместо массивов: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#data

Это также позволит вам указать, какие ячейки доступны для редактирования.

Вы можете установить ширину столбцов JTable, просто вызвав соответствующие методы в классе TableColumn. Дополнительная информация здесь: http://docs.oracle.com/javase/8/docs/api/javax/swing/table/TableColumn.html

Заголовок JTable автоматически отображается только тогда, когда он находится в JScrollPane. Вы добавляете свой JTable в JScrollPane, но ничего не делаете с этим JScrollPane. Сам JScrollPane должен быть где-то в JFrame.

13.08.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..