Как настроить столбцы JTable для размещения самого длинного содержимого в ячейках столбца
Я использую answer https://stackoverflow.com/a/5820366 и http://tips4java.wordpress.com/2008/11/10/table-column-adjuster/, и он работает, но часто размеры столбцов тоже широкий или слишком узкий.
Независимо от заполнения моей таблицы HTML или текста.
Использование стандартной TableModel
из документации oracle.
- Добавить фоновое изображение на панель
- JFrame.setBackground () не работает - почему?
- SwingWorker не обновляет JProgressBar без Thread.sleep () в пользовательской диалоговой панели
- Ключевые привязки и ключевые слушатели в Java
- JPanel в игре-головоломке не обновляется
Режим изменения размера = JTable.AUTO_RESIZE_OFF
Контейнер моего табулятора jGoodies:
FormLayout currentEventLayout = new FormLayout( "fill:p", "pref, pref"); PanelBuilder currentEventBuilder = new PanelBuilder(currentEventLayout); currentEventBuilder.add(mainQuotesTable.getTableHeader(), constraints.xy(1, 1)); currentEventBuilder.add(mainQuotesTable, constraints.xy(1, 2));
Пример HTML:
"
" + firstValue + "\n" + secondValue + ""
простая строка:
firstValue + " - " + secondValue
Вот пример:
public class TableAdjustExample { private static JTable mainTable; private static Random random = new Random(); private static List data; private static class Data { String name; String surname; private Data(String name, String surname) { this.name = name; this.surname = surname; } } public static void main(String[] args) { data = stubProvider(); final JFrame frame = new JFrame("table adjust example"); frame.add(createUI()); frame.pack(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setSize(350, 400); frame.setVisible(true); update(); java.util.Timer timer = new java.util.Timer(); timer.schedule(new TimerTask() { @Override public void run() { update(); } }, 3000, 3000); } private static JPanel createUI() { JPanel jPanel = new JPanel(); mainTable = new JTable(2, 3); mainTable.setModel(new AbstractTableModel() { @Override public int getRowCount() { return data.size(); } @Override public int getColumnCount() { return 2; } @Override public Object getValueAt(int rowIndex, int columnIndex) { Data dataItem = data.get(rowIndex); if (columnIndex == 0) { return dataItem.name; } if (columnIndex == 1) { return dataItem.surname; } throw new IllegalStateException(); } }); mainTable.setGridColor(Color.black); mainTable.setShowHorizontalLines(false); mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); final TableCellRenderer defaultRenderer = mainTable.getTableHeader().getDefaultRenderer(); mainTable.getTableHeader().setDefaultRenderer(new TableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable jTable, Object o, boolean b, boolean b1, int row, int column) { JLabel parent = (JLabel) defaultRenderer.getTableCellRendererComponent(jTable, o, b, b1, row, column); if (column == 0) { parent.setText("name"); } else { parent.setText("surname"); } return parent; } }); jPanel.add(mainTable.getTableHeader()); jPanel.add(mainTable); return jPanel; } private static void update() { System.out.println("updating"); data = stubProvider(); adjustJTableRowSizes(mainTable); for (int i = 0; i < mainTable.getColumnCount(); i++) { adjustColumnSizes(mainTable, i, 2); } } private static void adjustJTableRowSizes(JTable jTable) { for (int row = 0; row < jTable.getRowCount(); row++) { int maxHeight = 0; for (int column = 0; column < jTable.getColumnCount(); column++) { TableCellRenderer cellRenderer = jTable.getCellRenderer(row, column); Object valueAt = jTable.getValueAt(row, column); Component tableCellRendererComponent = cellRenderer.getTableCellRendererComponent(jTable, valueAt, false, false, row, column); int heightPreferable = tableCellRendererComponent.getPreferredSize().height; maxHeight = Math.max(heightPreferable, maxHeight); } jTable.setRowHeight(row, maxHeight); } } public static void adjustColumnSizes(JTable table, int column, int margin) { DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); TableColumn col = colModel.getColumn(column); int width; TableCellRenderer renderer = col.getHeaderRenderer(); if (renderer == null) { renderer = table.getTableHeader().getDefaultRenderer(); } JLabel comp = (JLabel) renderer.getTableCellRendererComponent( table, col.getHeaderValue(), false, false, 0, 0); width = comp.getPreferredSize().width; for (int r = 0; r < table.getRowCount(); r++) { renderer = table.getCellRenderer(r, column); comp = (JLabel) renderer.getTableCellRendererComponent( table, table.getValueAt(r, column), false, false, r, column); int currentWidth = comp.getPreferredSize().width; width = Math.max(width, currentWidth); } width += 2 * margin; col.setPreferredWidth(width); } private static List stubProvider() { List data = new ArrayList(); for (int i = 0; i < 4; i++) { data.add(new Data( "" + "
Jason" + "" + random.nextInt() + "" + "", "Statham " + random.nextInt())); } return data; } }
У меня такая проблема с настройкой высоты строки. Использование
\nвместо настройки фиксированной строки.
- Фоновое изображение для jPanel не работает
- Откройте JPanel после нажатия кнопки в JFrame
- Выбор файла в панели с Swing
- Почему мои вещи не отображаются в JFrame?
- Новая линия в JLabel
- Java Swing: как я могу реализовать экран входа в систему, прежде чем показывать JFrame?
- JTree: установка пользовательских открываемых / закрытых значков для отдельных групп
- Поворот изображения в java
Кажется, все работает хорошо для меня …
public class TestTable01 extends JPanel { private JTable mainTable; public TestTable01() { super(new GridLayout(1, 0)); String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; Object[][] data = { {"Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false)}, {"John", "Doe", "Rowing", new Integer(3), new Boolean(true)}, {"Sue", "Black", "Knitting", new Integer(2), new Boolean(false)}, {"Jane", "White", "Speed reading", new Integer(20), new Boolean(true)}, {"Joe", "Brown", "Pool", new Integer(10), new Boolean(false)} }; mainTable = new JTable(data, columnNames); mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); mainTable.setPreferredScrollableViewportSize(new Dimension(500, 70)); mainTable.setFillsViewportHeight(true); update(); //Create the scroll pane and add the table to it. JScrollPane scrollPane = new JScrollPane(mainTable); //Add the scroll pane to this panel. add(scrollPane); } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("SimpleTableDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. TestTable01 newContentPane = new TestTable01(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } private void update() { System.out.println("updating"); adjustJTableRowSizes(mainTable); for (int i = 0; i < mainTable.getColumnCount(); i++) { adjustColumnSizes(mainTable, i, 2); } } private void adjustJTableRowSizes(JTable jTable) { for (int row = 0; row < jTable.getRowCount(); row++) { int maxHeight = 0; for (int column = 0; column < jTable.getColumnCount(); column++) { TableCellRenderer cellRenderer = jTable.getCellRenderer(row, column); Object valueAt = jTable.getValueAt(row, column); Component tableCellRendererComponent = cellRenderer.getTableCellRendererComponent(jTable, valueAt, false, false, row, column); int heightPreferable = tableCellRendererComponent.getPreferredSize().height; maxHeight = Math.max(heightPreferable, maxHeight); } jTable.setRowHeight(row, maxHeight); } } public void adjustColumnSizes(JTable table, int column, int margin) { DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); TableColumn col = colModel.getColumn(column); int width; TableCellRenderer renderer = col.getHeaderRenderer(); if (renderer == null) { renderer = table.getTableHeader().getDefaultRenderer(); } Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0); width = comp.getPreferredSize().width; for (int r = 0; r < table.getRowCount(); r++) { renderer = table.getCellRenderer(r, column); comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, column), false, false, r, column); int currentWidth = comp.getPreferredSize().width; width = Math.max(width, currentWidth); } width += 2 * margin; col.setPreferredWidth(width); col.setWidth(width); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }
ОБНОВЛЕНО
В вашем примере есть ряд проблем.
- Таблицы действительно должны быть добавлены в
JScrollPane
, это позаботится о добавлении заголовка ...- Диспетчер компоновки по умолчанию для
JPanel
-FlowLayout
, в этом случае это, вероятно, не то, что вы хотите, вы, вероятно, захотите использоватьBorderLayout
- Свинг не является streamобезопасным. Пользователь
java.util.Timer
нарушит эту политику, это может привести к сбою синхронизации модели и представления. Вместо этого используйтеjavax.swing.Timer
.- Рендеринг двух
рядом с каждым приведет к тому, что механизм макета html разместит слабые разрывы между элементами. То есть, если движок решит, что недостаточно свободного пространства для демонстрации двух элементов, он будет разделять их. Лучше использовать один
с двумя тегами
вместо этого ...
Я бы прочитал
- Параллельность в Swing
- Как использовать таблицы
public class TestColumnWidths { private static JTable mainTable; private static Random random = new Random(); private static List data; private static class Data { String name; String surname; private Data(String name, String surname) { this.name = name; this.surname = surname; } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { data = stubProvider(); final JFrame frame = new JFrame("table adjust example"); frame.add(createUI()); frame.pack(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); update(); // java.util.Timer timer = new java.util.Timer(); // timer.schedule(new TimerTask() { // @Override // public void run() { // update(); // } // }, 3000, 3000); javax.swing.Timer timer = new javax.swing.Timer(3000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { update(); } }); timer.setRepeats(true); timer.setCoalesce(true); timer.start(); } }); } private static JPanel createUI() { JPanel jPanel = new JPanel(); mainTable = new JTable(2, 3); mainTable.setModel(new AbstractTableModel() { @Override public int getRowCount() { return data.size(); } @Override public int getColumnCount() { return 2; } @Override public Object getValueAt(int rowIndex, int columnIndex) { Data dataItem = data.get(rowIndex); if (columnIndex == 0) { return dataItem.name; } if (columnIndex == 1) { return dataItem.surname; } throw new IllegalStateException(); } }); mainTable.setGridColor(Color.black); mainTable.setShowHorizontalLines(false); mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); final TableCellRenderer defaultRenderer = mainTable.getTableHeader().getDefaultRenderer(); mainTable.getTableHeader().setDefaultRenderer(new TableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable jTable, Object o, boolean b, boolean b1, int row, int column) { JLabel parent = (JLabel) defaultRenderer.getTableCellRendererComponent(jTable, o, b, b1, row, column); if (column == 0) { parent.setText("name"); } else { parent.setText("surname"); } return parent; } }); // jPanel.add(mainTable.getTableHeader()); // jPanel.add(mainTable); jPanel.setLayout(new BorderLayout()); jPanel.add(new JScrollPane(mainTable)); return jPanel; } private static void update() { System.out.println("updating"); data = stubProvider(); adjustJTableRowSizes(mainTable); for (int i = 0; i < mainTable.getColumnCount(); i++) { adjustColumnSizes(mainTable, i, 2); } } private static void adjustJTableRowSizes(JTable jTable) { for (int row = 0; row < jTable.getRowCount(); row++) { int maxHeight = 0; for (int column = 0; column < jTable.getColumnCount(); column++) { TableCellRenderer cellRenderer = jTable.getCellRenderer(row, column); Object valueAt = jTable.getValueAt(row, column); Component tableCellRendererComponent = cellRenderer.getTableCellRendererComponent(jTable, valueAt, false, false, row, column); int heightPreferable = tableCellRendererComponent.getPreferredSize().height; maxHeight = Math.max(heightPreferable, maxHeight); } jTable.setRowHeight(row, maxHeight); } } public static void adjustColumnSizes(JTable table, int column, int margin) { DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); TableColumn col = colModel.getColumn(column); int width; TableCellRenderer renderer = col.getHeaderRenderer(); if (renderer == null) { renderer = table.getTableHeader().getDefaultRenderer(); } Component comp = renderer.getTableCellRendererComponent( table, col.getHeaderValue(), false, false, 0, 0); width = comp.getPreferredSize().width; for (int r = 0; r < table.getRowCount(); r++) { renderer = table.getCellRenderer(r, column); comp = renderer.getTableCellRendererComponent( table, table.getValueAt(r, column), false, false, r, column); int currentWidth = comp.getPreferredSize().width; width = Math.max(width, currentWidth); } width += 2 * margin; col.setPreferredWidth(width); } private static List stubProvider() { List data = new ArrayList(); for (int i = 0; i < 4; i++) { data.add(new Data( "" + "
" + "Jason" + "" + random.nextInt() + "" + "" + "", "Statham " + random.nextInt())); } return data; } }Установите разумную минимальную ширину для слишком узких столбцов. Затем вычислите ширину в соответствии с содержимым столбцов и установите их.
Эффект Marquee в Java Swing Правильный способ использования JLabels для обновления изображения Как я могу поместить ось в .png-файл в java? Рисование простого линейного графика в Java Как KeyListener обнаруживает комбинации клавиш (например, ALT + 1 + 1) Как использовать Drag-and-Drop в Swing для получения пути к файлу? KeyListener, keyPressed или keyTyped Добавление прокручиваемой JTextArea (Java) JTable отключить флажок в ячейке Как лучше всего настроить Swing GUI? invokeAndWait в SwingUtilities