Как вывести таблицу в java
Вывод в формате таблицы в Java’s System.out
Я получаю результаты из базы данных и хочу вывести данные в виде таблицы в стандартный вывод Java.
Я пробовал использовать \ t, но первый столбец, который мне нужен, очень разный по длине.
Есть ли способ отобразить это в красивой таблице, такой как вывод?
8 ответов
См. Документацию Javadocs для java.util.Formatter для получения дополнительной информации о синтаксисе ( System.out.format использует Formatter внутри).
Используя j-text-utils, вы можете распечатать для консоли таблицу, например:
И это очень просто:
Я создал проект, который может создавать очень сложные представления таблиц. Если вы должны распечатать таблицу, ширина таблицы будет иметь ограничение. Я применил его в одном из своих проектов, чтобы распечатать счет-фактуру клиента. Ниже приведен пример представления для печати.
Это код для вышеупомянутого режима печати и библиотеку (Wagu) можно найти здесь.
Я могу очень опоздать с ответом, но здесь простое и общее решение
Проверь это. Автор предлагает простое, но элегантное решение, не требующее сторонней библиотеки. http://www.ksmpartners.com/2013/ 08 / красиво-форматированный-табличный-вывод-в-Java /
Поскольку большинство решений немного устарело, я также могу предложить asciitable, который уже доступен в maven ( de.vandermeer:asciitable:0.3.2 ) и могут создавать очень сложные конфигурации.
Возможности (по выезду):
И использование по-прежнему выглядит простым:
Разница в размерах ввода не влияет на вывод
JTable и Serializable или таблицы в Java и танцы с бубном при сохранении объектов в файлы
Введение
Так получилось, что как дизайнеру, мне необходим простор для творчества при реализации любых зачач в написании программ. Давно я положил глаз на такую платформу как Java, так-как всегда мечтал о кроссплатформенном программном обеспечении. И вот недавно, я решил освоить такой прекрассный компонент в Java, как JTable, ну и по той причине, что всегда любил использовать таблицы в своих программах.
Нет-нет, я вас не буду отправлять сюда (Популярная цитата пользователей javatalks.ru и др. — «перед тем как задать тупой вопрос, посмотрите здесь. »).
и сюда. (How to Use Tables — tutorial)
или сюда (Using Swing Components: Examples).
или в стандартный хелп по таблицам
Хотя, я так говорю не с проста, так-как посмотрев там и поняв, что доки Java немного устарели, как по восприятию, так и по наличию вразумительного рабочего кода (я использовал Java версии 7.01). Но все же, не почитав этих справочных материалов, вы никогда не поймете самой сути, логики и психологии таблиц Java.
По этой причине, ниже описанный стабильный пример сериализации таблицы JTable, будет у вас работать так, как вы этого хотите, лишь при условии понимания того, что вы делаете и что хотите получить. На последок добавлю — некоторые куски кода были собраны в Интернет на разных ресурсах (за что им всем огромное спасибо), но их всех объединяет одно — я сам их отлаживал и притирал к своей программе, то есть идеально работающего кода я так и не нашел. Хотя… нет. Я построил свой код, только потому, что взял с одного из англоязычных ресурсов рабочий код программы сериализации, который у меня вылетал при попытке изменения данных в таблице (ссылка на ресурс к сожалению потерялась)…
Но «о драконах» кода по порядку.
О как же ты красноречив, дракон великий Error Log
Ну, теперь самое время сказать мне: «Ты че устраиваешь танцы с бубном? Или не читал этого? Гугли получше и не забивай нам всем мозги бирюльками для дизайна… Мы и без него можем обойтись.» И правда, почитав этот перевод книги «Java 2. Том 2. Тонкости программирования. Автора — Кей Хорстман и Гарри Корнелл» (у меня 8-е печатное издание), я обнаружил отличный код:
который не при каких обстоятельствах не хотел работать с таблицами, куда бы я не ставил магическую мантру «implements Serializable».
-Да ты не реализуй отдельный класс, а тули сразу в JTable при создании своего TableCellRenderer динамически и в нем делай все, что тебе нужно! — говорили одни…
-Неее… Тебе нужен отдельный класс, ведь Java — это не «хухры-мухры» и модели MVC никто не отменял. — говорили другие.
В общем, все эти споры и предложения реализации классов и методов, которые не работали или работали частично, меня очень расстроили и я даже хотел плюнуть на все и сделать таблицу с дефолтным «серым» графическим интерфейсом… Как вдруг, на одном из зарубежных форумов, обнаружил код, который по уверениям автора работал на все сто процентов и подходит под любые капризы дизайнера. Внимательно рассмотрев даный код я нашел метод, который создавал шаблон таблицы, если файл отсутсвовал на диске и заполнял ним таблицу. После проверки кода (очень близкий к указанному выше), я с удивлением обнаружил, что он работает! «О небо!» — подумал я — «Неужели мои молитвы услышаны и я могу отдать бубен обратно своей малышке дочери?!»… Но стоило мне внести в таблицу данные и нажать кнопку сохранить… как бубен, мне опять стал нужен…
Теперь, это стало делом чести! Я не мог позволить каким-то мантрам, влиять на отсутствие или наличие бубна у моей малышки дочери и на нервные срывы у соседей из-за постоянного звучания бубна… Короче, после короткой битвы с выделением в таблице:
я решил обратиться к шаманам всего мира и к самим создателям… И я пошел на баг-трекер Оракла, где с удивлением заметил, что ошибочка то вот она.
И длится бой уж много лет, с версии Java «1.4.0-beta2»
Тут я увидел, что особо просветленные шаманы, вроде Kleopatra, там давненько уже отрубают крылья дракона Error Log простым вызовом:
Ну вот и всё, дракон уж вроде побежден…
Ан нет, он в классы с TableCellRenderer был перемещен…
Уроки рисования, или «Нет-нет, мне нужно подсветить строку с ошибкой красненьким»
После не сложных плясок у нового костра разожженного очередными ошибками визуализации таблицы, я обнаружил, что будет уместным реализовать два класса отрисовки таблицы, один для ячеек и второй для названий (ярлыков) колонок:
Теперь это все нужно объявить:
В начале метода loadColumn() пишем:
Все сразу стало на свои места, все данные отлично читались и отрисовывались.
Теперь я начал искать в Интернете самое нужное мне, отрисовку ячеек, строк и колонок.
Как ни странно, но все ссылки с обещанием именно того, что нужно мне, вели сюда.
информация очень ценная, но по дизайну скудная и про TableCellRenderer, говорилось мало. Я начал сам эксперементировать с разными способами окраски таблицы и что я узнал в итоге?
Примеры окрашивания в таблице JTable:
Ну вот, вроде бы и все.
Теперь все работает — сохраняется в файл и раскрашивается в нужный цвет.
Для реализации своего замысла я использовал среду разработки Eclipse v. 3.7
Нужные внешние классы и код самой программы прилагаются (открывать в Eclipse).
Вывод в табличном формате в системе Java.из
Я получаю результаты из базы данных и хочу вывести данные в виде таблицы в стандартном выходе Java
Я пробовал использовать t, но первый столбец, который я хочу, очень переменный по длине.
есть ли способ отобразить это в хорошей таблице, такой как output?
8 ответов
см. Javadocs для java.util.Formatter для получения дополнительной информации о синтаксисе ( System.out.format использует Formatter внутренне).
С помощью j-text-utils вы можете напечатать на консоль таблицу:
Я создал проект, который может создавать расширенные представления таблиц. Если вы предполагали печати таблица, ширина таблицы будет иметь предел. Я применил его в одном из своих проектов, чтобы получить печать счета клиента. Ниже приведен пример представления печати.
этой это код для вышеуказанного вида печати, и вы можете найти библиотеку (Wagu) в здесь.
зацени. Автор предоставляет простое, но элегантное решение, которое не требует какой-либо сторонней библиотеки. http://www.ksmpartners.com/2013/08/nicely-formatted-tabular-output-in-java/
Я могу очень опоздать на ответ, но здесь простое и общее решение
Как Использовать Таблицы
Остальная часть этого раздела показывает Вам, как выполнить некоторые общие связанные с таблицей задачи. Вот являются темы этим разделом покрытия:
Составление Простой Таблицы
Нажмите кнопку Launch, чтобы работать SimpleTableDemo Сеть Java™ использования Запускается ( загрузите JDK 6 или позже ). Или, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.
Щелкните по ячейке, которая содержит «Сноубординг».
Вся первая строка выбирается, указывая, что Вы выбрали данные Кэти Смит. Специальное выделение указывает, что ячейка «Сноубординга» доступна для редактирования. Обычно, Вы начинаете редактировать текстовую ячейку двойным щелчком это.
Расположите курсор по «Имени». Теперь нажмите кнопку мыши и перетащите направо.
Как можно видеть, пользователи могут перестроить столбцы в таблицах.
Расположите курсор только направо от заголовка столбца. Теперь нажмите кнопку мыши и перетащите направо или оставленный.
Размер изменений столбца, и другие столбцы корректируются, чтобы заполнить остающееся пространство.
Таблица в SimpleTableDemo.java объявляет имена столбцов в Строковом массиве:
Его данные инициализируются и хранятся в двумерном Объектном массиве:
Затем Таблица создается, используя эти данные и columnNames:
Есть два JTable конструкторы, которые непосредственно принимают данные ( SimpleTableDemo использует первое):
Преимущество этих конструкторов состоит в том, что они удобны. Однако, у этих конструкторов также есть недостатки:
Если Вы хотите обойти эти ограничения, Вы должны реализовать свою собственную табличную модель, как описано в Создании Табличной Модели.
Добавление Таблицы к Контейнеру
Вот типичный код для того, чтобы создать область прокрутки, которая служит контейнером для таблицы:
Эти две строки в этом отрывке делают следующее:
Область прокрутки автоматически помещает табличный заголовок наверху области просмотра. Имена столбцов остаются видимыми наверху области просмотра, когда табличные данные прокручиваются.
Если Вы используете таблицу без области прокрутки, то следует получить табличный компонент заголовка и поместить его непосредственно. Например:
Установка и Изменение Ширин столбцов
По умолчанию все столбцы в таблице начинаются с равным width, и столбцы автоматически заполняют весь width таблицы. Когда таблица становится более широкой или более узкой (который мог бы произойти, когда пользователь изменяет размеры окна, содержащего таблицу), все ширины столбцов изменяются соответственно.
Когда пользователь изменяет размеры столбца, перетаскивая его правильную границу, тогда или другие столбцы должны изменить размер, или размер таблицы должен измениться. По умолчанию размер таблицы остается тем же самым, и все столбцы направо от перетащить точки изменяют размеры, чтобы разместить пространство, добавленное к или удаленный из столбца налево от перетащить точки.
Чтобы настроить начальные ширины столбцов, можно вызвать setPreferredWidth на каждом из столбцов Вашей таблицы. Это устанавливает и привилегированные ширины столбцов и их приблизительные относительные ширины. Например, добавляя следующий код к SimpleTableDemo делает его третий столбец больше чем другие столбцы:
Когда пользователь явно изменяет размеры столбцов, привилегированные ширины столбцов устанавливаются так, что, определенные пользователем размеры становятся новыми текущими ширинами столбцов. Однако, когда сама таблица изменяется — обычно, потому что окно изменило размеры —; привилегированные ширины столбцов не изменяются. Вместо этого существующие привилегированные ширины используются, чтобы вычислить новые ширины столбцов, чтобы заполнить свободное место.
Пользовательские Выборы
В ее конфигурации значения по умолчанию таблица поддерживает выбор, который состоит из одной или более строк. Пользователь может выбрать непрерывный диапазон строк или произвольный набор строк. Последняя ячейка, на которую указал пользователь, получает специальную индикацию; в Металлическом стили обрисовывается в общих чертах ячейка. Эта ячейка известна как ведущий выбор; это иногда вызывают «ячейкой с фокусом» или «текущей ячейкой».
Пользователь использует мышь и/или клавиатуру, чтобы сделать выборы, как описано в следующей таблице:
| Работа | Действие мыши | Действие клавиатуры |
|---|---|---|
| Выберите единственную строку. | Щелкнуть. | Стрелка вверх или Стрелка вниз. |
| Расширьте непрерывный выбор. | Щелчок при нажатой клавише Shift или Перетаскивает по строкам. | Стрелка Shift-Up или Стрелка Shift-Down. |
| Добавьте строку к выбору строки выбора/переключателя. | Щелчок управления | Переместите ведущий выбор со Стрелкой вверх управления или Стрелкой вниз управления, затем используйте клавишу «Пробел», чтобы добавить к выбору или клавише «Пробел» управления, чтобы переключить выбор строки. |
Чтобы видеть, как выборы работают, нажмите кнопку Launch, чтобы работать TableSelectionDemo Сеть Java™ использования Запускается ( загрузите JDK 6 или позже ). Или, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.
Этот пример программы представляет знакомую таблицу, и позволяет пользователю управлять определенными опциями JTable. Есть также текстовая область, которая регистрирует события выбора.
Под «Режимом выбора» есть ряд переключателей. Щелкните по тому маркированный «Единственный Выбор». Теперь можно только выбрать одну строку за один раз. Если Вы щелкаете по переключателю «Single Interval Selection», можно выбрать ряд строк, которые должны быть непрерывными.
Если Вы снимаете все три флажка (устанавливающий все три связанных свойства в false ), нет никакого выбора; только ведущий выбор показывают.
Чтобы получить текущий выбор, использовать JTable.getSelectedRows который возвращается, массив строки индексирует, и JTable.getSelectedColumns который возвращается, массив столбца индексирует. Чтобы получить координаты ведущего выбора, обратитесь к моделям выбора для таблицы непосредственно и для модели столбца таблицы. Следующий код форматирует строку, содержащую строку и столбец ведущего выбора:
Создание Табличной Модели
JTable конструктор, используемый SimpleTableDemo создает его табличную модель с кодом как это:
Поскольку предыдущий код показывает, реализовывая табличную модель может быть простым. Обычно, Вы реализуете свою табличную модель в подклассе AbstractTableModel class.
Ваша модель могла бы содержать свои данные в массиве, векторе, или хешировать карту, или это могло бы получить данные от внешнего источника, такого как база данных. Во время выполнения это могло бы даже генерировать данные.
Эта таблица отличается от SimpleTableDemo таблица следующими способами:
Прислушивание к Изменениям Данных
Увольнение Событий Изменения Данных
| Метод | Изменение |
|---|---|
| fireTableCellUpdated | Обновление указанной ячейки. |
| fireTableRowsUpdated | Обновление указанных строк |
| fireTableDataChanged | Обновление всей таблицы (данные только). |
| fireTableRowsInserted | Вставляются новые строки. |
| fireTableRowsDeleted | Существующие Удаленные строки |
| fireTableStructureChanged | Лишите законной силы всю таблицу, и данные и структура. |
Понятия: Редакторы и Средства рендеринга
Прежде, чем Вы продолжите к следующим немногим задачам, Вы должны понять, как таблицы тянут свои ячейки. Вы могли бы ожидать, что каждая ячейка в таблице будет компонентом. Однако, по причинам производительности, таблицы Swing реализуются по-другому.
Вместо этого единственное средство рендеринга ячейки обычно используется, чтобы потянуть все ячейки, которые содержат тот же самый тип данных. Можно думать о средстве рендеринга как о конфигурируемом штампе чернил что табличное использование, чтобы штамповать соответственно отформатированные данные на каждую ячейку. Когда пользователь начинает редактировать данные ячейки, редактор ячейки принимает ячейку, управляя поведением редактирования ячейки.
Чтобы выбрать средство рендеринга, которое выводит на экран ячейки в столбце, таблица сначала определяет, определили ли Вы средство рендеринга для того определенного столбца. Если Вы не сделали, то таблица вызывает табличную модель getColumnClass метод, который получает тип данных ячеек столбца. Затем, таблица сравнивает тип данных столбца со списком типов данных, для которых регистрируются средства рендеринга ячейки. Этот список инициализируется таблицей, но можно добавить к этому или изменить это. В настоящий момент, таблицы, помещенные следующие типы данных в списке:
Редакторы ячейки выбираются, используя подобный алгоритм.
Имейте в виду, что, хотя средства рендеринга определяют, как каждая ячейка или взгляды заголовка столбца и могут определить свой текст подсказки, средство рендеринга не обрабатывает события. Если Вы должны поднять события, которые имеют место в таблице, метод, который Вы используете, изменяется видом события, которым Вы интересуетесь:
| Ситуация | Как Получить События |
|---|---|
| Обнаружить события от ячейки, которая редактируется. | Используйте редактора ячейки (или зарегистрируйте слушателя на редакторе ячейки). |
| Обнаружить выборы строки/столбца/ячейки и отмены выбора. | Используйте слушателя выбора как описано в Обнаружении Пользовательских Выборов. |
| Обнаружить события от нажатия мыши на заголовке столбца. | Зарегистрируйте соответствующий тип слушателя мыши на таблице JTableHeader объект. (См. TableSorter.java для примера.) |
| Обнаружить другие события. | Зарегистрируйте соответствующего слушателя на JTable объект. |
Следующие немного разделов говорят Вам, как настроить дисплей и редактирование, определяя средства рендеринга и редакторов. Можно определить средства рендеринга ячейки и редакторов или столбцом или типом данных.
Используя Пользовательские Средства рендеринга
Вот код от TableDialogEditDemo.java это регистрирует a ColorRenderer экземпляр как средство рендеринга значения по умолчанию для всех Color данные:
Чтобы определить специфичное для ячейки средство рендеринга, Вы должны определить a JTable подкласс, который переопределяет getCellRenderer метод. Например, следующий код заставляет первую ячейку в первом столбце таблицы использовать пользовательское средство рендеринга:
Определение Подсказок для Ячеек
По умолчанию текст подсказки, выведенный на экран для табличной ячейки, определяется средством рендеринга ячейки. Однако, иногда может быть более просто определить текст подсказки, переопределяя JTable ‘s реализация getToolTipText(MouseEvent) метод. Этот раздел показывает Вам, как использовать оба метода.
Хотя текст подсказки в предыдущем примере статичен, можно также реализовать подсказки, текст которых изменяется в зависимости от состояния ячейки или программы. Вот пара способов сделать так:
Вот пример того, на что похожа подсказка:
Можно определить текст подсказки, переопределяя JTable ‘s getToolTipText(MouseEvent) метод. Программа TableToolTipsDemo шоу, как. Нажмите кнопку Launch, чтобы работать, она использующий Сеть Java™ Запускается ( загрузите JDK 6 или позже ). Или, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.
Ячейки с подсказками находятся в столбцах Sport и Vegetarian. Вот изображение его подсказки:
Вот код от TableToolTipsDemo.java это реализует подсказки для ячеек в столбцах Sport и Vegetarian:
Определение Подсказок для Заголовков Столбца
TableToolTipsDemo.java имеет пример реализации подсказок заголовка столбца, которые изменяются столбцом. Если Вы работаете TableToolTipsDemo (нажмите кнопку Launch), использующий Сеть Java™ Запускаются ( загрузите JDK 6 или позже ). Или, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.
Вы будете видеть подсказки когда Вы мышь по любому заголовку столбца за исключением первых двух. Никакие подсказки не были suppled для столбцов имени, так как они казались очевидными. Вот изображение одной из подсказок заголовка столбца:
Следующий код реализует подсказки. В основном это создает подкласс JTableHeader это переопределяет getToolTipText(MouseEvent) метод так, чтобы это возвратило текст для текущего столбца. Связать пересмотренный табличный заголовок с таблицей, JTable метод createDefaultTableHeader переопределяется так, чтобы это возвратило экземпляр JTableHeader подкласс.
Сортировка и Фильтрация
Табличной сортировкой и фильтрацией управляет объект сортировщика. Самый легкий способ обеспечить объект сортировщика состоит в том, чтобы установить autoCreateRowSorter связанное свойство к true :
TableRowSorter использование java.util.Comparator объекты сортировать его строки. class, который реализует этот интерфейс, должен обеспечить вызванный метод compare это определяет, как любые два объекта сравниваются с целью сортировки. Например, следующий код создает a Comparator это сортирует ряд строк последним словом в каждой строке:
Определить который Comparator использовать для столбца, TableRowSorter попытки применить каждое из следующих правил поочередно. Правила сопровождаются в упомянутом ниже порядке; первое правило, которое предоставляет сортировщику a Comparator используется, и проигнорированные правила remainining.
В дополнение к переупорядочению результатов табличный сортировщик может также определить, какие строки будут выведены на экран. Это известно как фильтрация. TableRowSorter использование фильтрации реализаций javax.swing.RowFilter объекты. RowFilter реализации несколько методов фабрики, которые создают общие виды фильтров. Например, regexFilter возвраты a RowFilter это фильтрует основанный на регулярном выражении.
В следующем примере кода Вы явно создаете объект сортировщика, таким образом, можно позже использовать его, чтобы определить фильтр:
Затем Вы фильтруете основанный на текущей стоимости текстового поля:
В последующем примере, newFilter() вызывается каждый раз изменения текстового поля. Когда пользователь вводит сложные регулярные выражения, try. catch препятствует тому, чтобы исключение синтаксиса вмешалось во ввод.
Если пользователь щелкает дважды по второму столбцу, четвертая строка становится первой строкой — но только в представлении:
Как ранее отмечено, текст, который пользователь вводит в текстовое поле «Filter Text», определяет фильтр, который определяет, какие строки показывают. Как с сортировкой, фильтрация может заставить координаты представления отклоняться от координат модели:
Вот код, который обновляет поле состояния, чтобы отразить текущий выбор:
Используя Поле комбинированного списка как Редактор
Устанавливая поле комбинированного списка, поскольку редактор прост как следующие шоу в качестве примера. Полужирная строка кодовых наборов поле комбинированного списка как редактор для определенного столбца.
Вот изображение редактора поля комбинированного списка в использовании:
Используя Других Редакторов
Вот изображение таблицы с диалоговым окном, которое служит, косвенно, как редактор ячейки. Когда пользователь начинает редактировать ячейку в столбце Favorite Color, кнопка (истинный редактор ячейки) появляется и переводит в рабочее состояние диалоговое окно, с которым пользователь может выбрать различный цвет.
Можно работать TableDialogEditDemo (нажмите кнопку Launch), использующий Сеть Java™ Запускаются ( загрузите JDK 6 или позже ). Или, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.
Как можно видеть, код довольно прост. Единственная часть, которая немного хитра, является звонком fireEditingStopped в конце обработчика действия кнопки редактора. Без этого вызова редактор остался бы активным, даже при том, что модальное диалоговое окно больше не видимо. Звонок fireEditingStopped позволяет таблице знать, что она может деактивировать редактора, позволяя ячейке быть обработанным средством рендеринга снова.
Используя Редактора, чтобы Проверить Вводимого пользователем текста
Если Вы любите иметь текстовое поле как редактор для ячейки, но хотите настроить это — возможно, чтобы проверить вводимый пользователем текст более строго или реагировать по-другому, когда текст недопустим — можно изменить редактора ячейки, чтобы использовать отформатированное текстовое поле. Отформатированное текстовое поле может проверить значение или непрерывно в то время как пользователь вводит или после того, как пользователь указал на конец ввода (такой, поскольку нажатием Входят).
Печать
JTable обеспечивает простой API для того, чтобы он напечатал таблицы. Самый легкий способ распечатать таблицу состоит в том, чтобы вызвать JTable.print без параметров:
JTable обеспечивает несколько перегрузок print с различными вариантами. Следующий код от TablePrintDemo.java шоу, как определить верхний колонтитул страницы:
Примеры то Использование Таблицы
Эта таблица приводит примеры то использование JTable и где те примеры описываются.
Ваше использование этой страницы и всего материала на страницах под «Учебным баннером» Java подвергается этим официальным уведомлениям.
|















