Java — Swing добавление данных в таблицу


Java Swing Добавить объект в таблицу

У меня трудности с добавлением объекта в таблицу. В моей таблице 4 столбца, и объект, который я пытаюсь добавить, создается с помощью пользовательского ввода. Я пытаюсь добавить его в таблицу, когда пользователь нажимает кнопку «Подтвердить». (я не опубликовал весь свой код, это было бы слишком долго, но у вас есть важная часть здесь)

Использование table = new JTable(rows, columnNames); создает DefaultTableModel за кулисами.

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

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

Лучшим решением было бы определить и использовать свой собственный TableModel который был разработан для управления самим объектом.

Это позволяет вам хранить информацию о Card в одном месте и снижает риск ее несинхронизации, а также избавляет от необходимости «декодировать» и «кодировать» данные.

Посмотрите на Как использовать таблицы для более подробной информации

Работоспособный пример .

Это простой исполняемый пример, демонстрирующий основные концепции использования CardTableModel

Java. Swing. Кнопки. Списки. Таблицы

В этой теме 0 ответов, 1 участник, последнее обновление Васильев Владимир Сергеевич 1 год назад.

Кнопки


Работа с кнопками осуществляется потомками класса AbstractButton:

  • JButton — обычная командная кнопка;
  • JCheckBox — кнопка флажок;
  • JRadioButton — радио кнопка. Для логической группировки этих кнопок служит объект класса ButtonGroup.

В большинстве случаев в конструкторе кнопки указывается командная строка. Она же по умолчанию является текстом кнопки. Изменить и получить командную строку можно
методами setActionCommand и getActionCommand. Изменить и получить текст кнопки можно методами setText и getText.

Кнопкам можно назначить быструю клавишу:
mybutton.setMnemonic(KeyEvent.VK_F); // ALT+F

Обработка нажатия осуществляется через интерфейс ActionListener. Дополнительно для
кнопки флажка можно обрабатывать событие изменение состояния через интерфейс ItemListener.

Также предусмотрены методы для назначения изображений на различные состояния кнопки, например setPressedIcon.

Ниже приведен пример окна с тремя видами кнопок. При нажатии на любой кнопке в консоль выводится ее командная строка. А при нажатии кнопки «Ок» дополнительно выводятся текущие состояния остальных кнопок.

Списки

Для работы со списками по необходимости используются следующие классы:

  • JList — визуальный компонент отображения списка. Массив элементов можно указать при инициализации или методом setListData;
  • DefaultListModel — класс по управлению данными списка. Если необходимо добавление/удаление одиночных элементов в режиме реального времени, то объект этого типа необходимо создавать явно (чтобы иметь к нему доступ);
  • ListCellRenderer — интерфейс для пользовательского отображения элементов списка. По умолчанию элемент списка отображается в виде текста. Если объект представляющий элемент не является строкой, то используется метод toString.

настройка списка


  • setLayoutOrientation — определяет порядок отображения элементов
    • VERTICAL — по вертикали в один столбец;
    • HORIZONTAL_WRAP — горизонтали в несколько строк;
    • VERTICAL_WRAP — по вертикали в несколько столбцов.
  • setVisibleRowCount — определяет желательное число отображаемых строк,
    значение -1 указывает максимальное число строк;
  • setPrototypeCellValue — устанавливает объект, чьи размеры будут шаблоном для всех элементов. Это позволяет ускорить отрисовку списка (доп. см. методы setFixedCellWidth и setFixedCellHeight).

выделение элементов

  • addListSelectionListener — добавить обработчик на выделение элемента;
  • getSelectedIndex — получить индекс первого выделенного элемента;
  • getSelectedIndices — получить индексы выделенных элементов;
  • getSelectedValue — получить выделенный элемент(ы);
  • setSelectedIndex — выделеить указанный элемент;

  • setSelectedIndices — выделить указанные элементы;
  • setSelectedValue — выделить указанный объект;
  • addSelectionInterval — добавить интервал элементов к текущему выделению;
  • isSelectedIndex — выделен ли указанный элемент;
  • isSelectionEmpty — истина, если выделенных элементов нет;
  • clearSelection — снять выделение.

внутренняя структура списка

  • setModel/getModel — определяют текущую модель управления элементами. Сама модель описывается интерфейсом ListModel (реализован в классе DefaultListModel);
  • setSelectionModel/getSelectionModel — определяют текущую модель выбора элементов. Сама модель описывается интерфейсом ListSelectionModel (реализован в
    классе DefaultListSelectionModel);
  • setCellRenderer/getCellRenderer — определяют текущий отрисовщик элемента.
    Сам отрисовщик описывается интерфейсом ListCellRenderer (реализован в классе
    DefaultListCellRenderer и других).

список флажков

Ниже приведен пример как, заменяя отрисовщик (ChkRender), получить новый элемент управления. В данном случае список кнопок флажков (чекбоксы).

Таблицы

Таблица описывается классом JTable.

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

сетка

  • getGridColor() — цвет сетки;
  • setGridColor(Color c) — установить цвет сетки;
  • setShowGrid(boolean a) — включает/выключает отображение сетки вокруг ячеек;
  • setShowHorizontalLines(boolean a) — включает/выключает отображение горизонтальных линий сетки;
  • setShowVerticalLines(boolean a) — включает/выключает отображение вертикальных линий сетки;

  • getShowHorizontalLines() — определяет, выводятся ли горизонтальные линии между ячейками;
  • getShowVerticalLines() — определяет, выводятся ли вертикальные линии между
    ячейками.

обработка события выделения

Работа с выделением в JTable осуществляется двумя объектами c интерфейсом ListSelectionModel. Первый управляет выделенными строками, он доступен через метод getSelectionModel. Второй управляет выделенными столбцами. Он входит в состав объекта управления столбцами, и доступен через вызов
getColumnModel().getSelectionModel() .

В качестве обработчиков выделения строк и столбцов используются объекты с интерфейсами ListSelectionListener и TableColumnModelListener соответственно.

Ниже приведен переделанный предыдущий пример для демонстрации обработки событий выделения строки и столбца.

Сам класс JTable также реализует интерфейсы ListSelectionListener и TableColumnModelListener. Таким образом, второй способ обработки событий — создание потомка от JTable с подменой методов valueChanged() и columnSelectionChanged().

Study & Dev О программировании и не только

Про java swing — часть 4

February 26, 2008

Создание таблицы (JTable) и заполнение ее данными

Основным элементом управления для создания типовых приложений является jtable – таблица. В отличии от того подхода, который мы использовали в mfc с классом clistview (всмомните, что таблица являлась по сути отдельной разновидностью такого элемента как clistview, но с назначенным стилем отображения REPORT).


Так вот, в библиотеке swing класс Jtable служит только для представления табличных данных.

Простейший пример создания таблицы будет выглядеть так:

Примечания: в примере создается вектор с именами колонок, а также вектор, каждый элемент которого является еще одним вектором представляющим отдельную запись и состоит из объектов (полей записи).

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

Недостатоком данного примера является то, что все колонки таблицы представляются в виде строк и доступны для редактирования. А самое главное то, что все данные, которые должны быть представлены в таблице, должны быть заранее помещены в контейнер Vector, что в случае работы с базами данных часто составляет сложности. Другой вариант конструктора Jtable приводящий к аналогичным результатам:

Следующий способ создания таблицы покажет все приемы использования концепции моделей и рендереров, которые мы узнали при работе со списками. В следующем примере создается таблица, отображающая файлы картинок в заданном каталоге. Разные колонки отображают имя файла, размер и окно-preview.

Данный пример можно развить: прежде всего сделаем так, чтобы переход к режиму редактирования осуществлялся только при двойном нажатии мыши. Метод IsCellEditable должен вернуть true в том случае, если событие произошедшее с ячейкой, должно активировать редактор ячейки. Объект события передается внутри anEvent, и имеет тип EventObject. Этот тип является базовым для множества объектов событий более конкретных (работа с мышью, клавиатура . ). В примере ниже я проверяю относится ли данное событие к категории «события с мышью» и если так, то дополнительно проверяю, чтобы количество кликов мыши было двойным. Только тогда возвращается значение true из метода isCellEditable, а значит выполняется переход в режим редактора.

Работа с моделью выделения

Также как для списка Jlist или JcomboBox, для таблицы есть связанная модель, управляющая тем, какие элементы были выделены. Она позволяет проверить какие строки таблицы выделены, также можно программно изменить выделение. В примере ниже создается таблица, заполненная случайными числами. Внизу формы расположена Jlabel, в которую выводится сумма элементов для выделенного диапазона таблицы (по умолчанию вы выделяете всю строку целиком).

Обнаружение изменений в таблице

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

Однако в случае, если вы хотите явно известить таблицу о том, что произошли изменения следует использовать вызовы:


Еще раз про render-ы и editor-ы

Примечание относительно render-ов: начиная с версии jdk 1.3 и более поздних разработчики ввели в состав Jtable автоматическую поддержку renderer-ов для следующих типов данных:

  • Boolean — отрисовыывается с помощью check box.
  • Number — с помощью Jlabel содержимое которой выравнено по правому краю
  • Double, Float — аналогично но при этом используется объект форматирования NumberFormat (локаль по умолчанию).
  • Date — с помощью Jlabel содержимое которой форматируется с помощью DateFormat (короткий стиль).
  • ImageIcon, Icon — Jlabel с выравненой по цетру картинкой.
  • Object — Jlabel – используется в качестве надписи значение которое вернул метод toString.

В данном примере нехватает последней мелочи – наличия перекрытого метода setValue. Мы можем выбирать в падающем списке новые значения, но значение столбца не изменится. Именно метод setValue ответственен за сохранение изменнение из редактора ячейки в модель данных таблицы.

Основное применение для использования редакторов – ограничение ввода значений в поля таблицы. Основной принцип избежать ошибки ввода — запретить вводить все, кроме предопределенного набора значений. И здесь нам помогают падающие поля, текстовые поля с маской).

В примере, где использовался редактор для имени файла, я создал собственный класс редактора как реализующий интерфейс от TableCellEditor . Для демонстрации внутреннего устройства любого редактора, в некоторых ситуациях имеет смысл использовать класс javax.swing.DefaultCellEditor, который является наследником от TableCellEditor и реализует часть рутинных методов (ту же генерацию событий). Например, ниже приводится прием с созданием редактора для поля представляющего собой цвет. Редактором ячейки является кнопка, при нажатии на которую появляется окно выбора цвета JcolorChooser:

Всплывающие подсказки

Также как и для любого другого элемента управления swing, вы можете задавать и управлять подсказкой (tooltip), используя метод setTooltip (String). Однако есть возможность управлять подсказками более детально (setTooltip задает глобальную подсказку не зависящую от того на какую именно ячейку таблицы была наведена мышь). Например, начнем мы с того что, что создадим подсказку для каждой отдельной ячейки отдельно подсказку для заголовка таблицы.

Добавление новой строки в JTable по кнопке (Java) (Swing)

Да,вопрос от новичка.Не нужно издеваться.

Есть таблица JTable


В красных областях ( это было нарисовано в paint) необходимо добавить три кнопки :

  1. Добавить — по нажатию этой кнопки должна появиться новая строка.
  2. Сохранить — слушатель событий я сам привяжу,но нужно сделать так,что если где-то оказалась пустая ячейка,по нажатию чтобы он выбросил диалог «Есть пустые поля! Проверьте все поля!», а куда сохранять и т.д. это я сам сделаю. Это не сложно.
  3. Удалить — удаляет выбранную строку.

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

Модель таблицы вот :

Способ удаления строки вот :

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

Примеры использования компонента JTable

Возможно, вам приходилось сталкиваться с необходимостью вывода каких-либо данных в виде таблицы, используя Swing(Java). Самый естественный подход — использование JTable . Но это не самый удобный компонент, поскольку базовая версия не обладает должной гибкостью, а реализация своих способов вывода и отображения информации вызывает определенные трудности. Поэтому я хочу поделится с вами своим опытом работы с JTable и привести максимально доступные для понимания примеры. Наша цель — корректное отображение динамических данных в JTable. Заинтересованных читателей прошу под кат.

Разработчики JTable создали его по парадигме «модель-вид-контроллер». Другими словами, это разделило JTable на части таким образом, что одна отвечает за способы отображения информации, другая за внешний вид, третья за получение данных. Не будем углубляться в подробности, кому интересно, можете поискать в сети. Наша задача разобраться на примерах, как организовать вывод данных из какой-либо структуры в таблицу. За это отвечает модель таблицы.

Самый простой способ создания JTable — массив. Конструктору передается массив названий столбцов и массив значений. Все остальное таблица делает сама. Приведу пример.

В результате получится вот такое вот окно: Рассмотрим подробнее. Сначала создаются два массива. Один содержит заголовки, второй данные для таблицы. Массив с данными, в каждой строке должен содержать такое же количество элементов, как и массив с заголовками. Таблица создается конструктором, принимающим два элемента, в качестве которых выступают наши массивы. При этом таблица создает модель данных сама. Потом мы создаем JScrollPane, которая нужна для возможности прокрутки содержимого таблицы. Добавляем таблицу на объект JScrollPane, а его в наш контейнер. Отображаем окно. В принципе ничего сложного.

Но использование массивов для задания значений неудобно. Во первых данные могут лежать в БД, тогда будет необходимо их преобразовать в массив. Это неудобно и неэффективно. Кроме-того, при изменении данных, придется заново создавать таблицу, с новыми массивами.


Решением этой проблемы является создание своей модели таблицы. Модель таблицы можно создать разными способами. Можно пойти более сложным путем, создав класс, реализующий интерфейс TableModel. Тогда придется описывать все необходимые методы интерфейса и разбираться, как они работают. Кроме того, нужно будет хранить слушатели событий для модели данных. Мы рассмотрим более простой способ. Класс AbstractTableModel содержит реализацию всех методов интерфейсаTableModel за исключением getValueAt(), getRowCount() и getColumnCount(). Создадим свой класс, унаследовав его от AbstractTableModel и реализуем эти методы.

6. Урок по Java. SWING, Hello World

В этом уроке я приведу пример простой программы с GUI интерфейсом на SWING

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

Создадим класс Example:

В самом начале мы импортируем нужный нам функционал, в ссылке в конце листинга можете ознакомиться с остальными возможностями и функционалом модуля SWING

В этой программе мы увидим самый простой функционал действий кнопок и простого изменения значения поля, плюс посмотрели синтаксис связывания окна и панели и присваивания прослушивателя объектам(кнопкам) и связывания их с действиями.

Если Вы хотите обменяться ссылками со мной между сайтами — пишите в контактах

Java — Swing добавление данных в таблицу

Для добавления, редактирования и удаления данных мы можем ипользовать рассмотренный в прошлой теме метод executeUpdate . С помощью результата метода мы можем проконтроллировать, сколько строк было добавлено, изменено или удалено.

Добавление

Так, возьмем созданную в прошлой теме таблицу Products:

И добавим в эту таблицу несколько объектов:

Для добавления данных в БД применяется команда INSERT. В данном случае в таблицу Products добавляется три объекта. И после выполнения программы на консоли мы увидим число добавленных объектов:

А добавленные строки мы можем увидеть в таблице в бд MySQL:

Редактирование

Изменим строки в таблице, например, уменьшим цену товара на 5000 единиц. Для изменения применяется команда UPDATE:

Удаление

Удалим один объект из таблицы с помощью команды DELETE:

Как видно из примеров, не так сложно взаимодействовать с базой данных. Достаточно передать в метод executeUpdate нужную команду SQL.

Добавление данных в JTable в SWING

Я пытаюсь разработать рецепт врача. Мое требование — создать таблицу, в которую пользователь может вставлять данные; так же, как пользователь вводит данные в текстовые поля.

В основном мне нужен шаблон таблицы, куда пользователь может вставить данные.

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

1 ответ

Вы можете найти объяснение наиболее важных основ работы с JTable в руководстве по Java.

Добавление таблицы в Java Swing

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

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

2 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Добавление таблицы в Java Swing

December 2020

1.9k раз

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

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

2 ответы

read Oracles tutorial about How to use JTable,

Цукерберг рекомендует:  Что читать программисту Android
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих