Реализация заголовка строки JTable [дубликат]

StackOverflow https://stackoverflow.com/questions/1434933

  •  07-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

Как я могу создать JTable с заголовком строки?

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

Это было полезно?

Решение 2

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

Спасибо!Леандро

Другие советы

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

Это JTable с изменяемым размером rowHeader (перетаскивайте мышь между строками заголовка для изменения размера, как обычно со столбцами)

Он запрашивает путь к изображению, чтобы показать перерисовку при изменении размера (работает хорошо)

$ java JTableRowHeader /path/to/image.gif

Это и есть код

import javax.swing.;импортировать javax.swing.событие.MouseInputAdapter;импортируйте javax.swing.table.DefaultTableCellRenderer по умолчанию;импортируйте javax.swing.table.JTableHeader;импортируйте javax.swing.table.Столбец таблицы;импортируйте java.awt.;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Vector;

/** * JTable с возможностью изменения размеров * Пользователь:alberto * Дата:23/01/13 * Время:1:04 */ открытый класс JTableRowHeader {

private static final String COL_IMAGE = "Image"; private static final int MIN_ROW_HEIGHT = 12; public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); String filename = args[0]; if (new File(filename).exists()) { System.out.println("Provide the path of an image"); } final JTable table = new JTable(new Object[][]{ {filename, filename, 5.5} , {filename, null, 7} , {"nothing", null, 12}} , new Object[]{"File", COL_IMAGE, "Number"}); JScrollPane scrollPane = new JScrollPane(table); JPanel panel = new JPanel(new BorderLayout()); panel.add(scrollPane, BorderLayout.CENTER); TableColumn column = table.getColumn(COL_IMAGE); column.setCellRenderer(new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value != null) { ImageIcon image = new ImageIcon(value.toString()); setIcon(image); } else { setIcon(null); } setHorizontalAlignment(JLabel.CENTER); return this; } }); table.setRowHeight(0, 200); scrollPane.setRowHeaderView(buildRowHeader(table)); frame.getContentPane().add(panel); frame.setPreferredSize(new Dimension(400, 400)); frame.pack(); frame.setVisible(true); } private static JList buildRowHeader(final JTable table) { final Vector<String> headers = new Vector<String>(); for (int i = 0; i < table.getRowCount(); i++) { headers.add(String.valueOf((char) (i + 65)).toUpperCase()); } ListModel lm = new AbstractListModel() { public int getSize() { return headers.size(); } public Object getElementAt(int index) { return headers.get(index); } }; final JList rowHeader = new JList(lm); rowHeader.setOpaque(false); rowHeader.setFixedCellWidth(50); MouseInputAdapter mouseAdapter = new MouseInputAdapter() { Cursor oldCursor; Cursor RESIZE_CURSOR = Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR); int index = -1; int oldY = -1; @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); } @Override public void mouseMoved(MouseEvent e) { super.mouseMoved(e); int previ = getLocationToIndex(new Point(e.getX(), e.getY() - 3)); int nexti = getLocationToIndex(new Point(e.getX(), e.getY() + 3)); if (previ != -1 && previ != nexti) { if (!isResizeCursor()) { oldCursor = rowHeader.getCursor(); rowHeader.setCursor(RESIZE_CURSOR); index = previ; } } else if (isResizeCursor()) { rowHeader.setCursor(oldCursor); } } private int getLocationToIndex(Point point) { int i = rowHeader.locationToIndex(point); if (!rowHeader.getCellBounds(i, i).contains(point)) { i = -1; } return i; } @Override public void mouseReleased(MouseEvent e) { super.mouseReleased(e); if (isResizeCursor()) { rowHeader.setCursor(oldCursor); index = -1; oldY = -1; } } @Override public void mouseDragged(MouseEvent e) { super.mouseDragged(e); if (isResizeCursor() && index != -1) { int y = e.getY(); if (oldY != -1) { int inc = y - oldY; int oldRowHeight = table.getRowHeight(index); if (oldRowHeight > 12 || inc > 0) { int rowHeight = Math.max(MIN_ROW_HEIGHT, oldRowHeight + inc); table.setRowHeight(index, rowHeight); if (rowHeader.getModel().getSize() > index + 1) { int rowHeight1 = table.getRowHeight(index + 1) - inc; rowHeight1 = Math.max(12, rowHeight1); table.setRowHeight(index + 1, rowHeight1); } } } oldY = y; } } private boolean isResizeCursor() { return rowHeader.getCursor() == RESIZE_CURSOR; } }; rowHeader.addMouseListener(mouseAdapter); rowHeader.addMouseMotionListener(mouseAdapter); rowHeader.addMouseWheelListener(mouseAdapter); rowHeader.setCellRenderer(new RowHeaderRenderer(table)); rowHeader.setBackground(table.getBackground()); rowHeader.setForeground(table.getForeground()); return rowHeader; } static class RowHeaderRenderer extends JLabel implements ListCellRenderer { private JTable table; RowHeaderRenderer(JTable table) { this.table = table; JTableHeader header = this.table.getTableHeader(); setOpaque(true); setBorder(UIManager.getBorder("TableHeader.cellBorder")); setHorizontalAlignment(CENTER); setForeground(header.getForeground()); setBackground(header.getBackground()); setFont(header.getFont()); setDoubleBuffered(true); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { setText((value == null) ? "" : value.toString()); setPreferredSize(null); setPreferredSize(new Dimension((int) getPreferredSize().getWidth(), table.getRowHeight(index))); //trick to force repaint on JList (set updateLayoutStateNeeded = true) on BasicListUI list.firePropertyChange("cellRenderer", 0, 1); return this; } }

}

прокомментируйте строки о пути к изображению, если вас это не волнует.

Вот и результат:

Screenshot of JTableRowHeader

Это еще одно нарушение.Столбец строки / заголовок зафиксирован на месте :

http://blue-walrus.com/2014/12/row-number-column-in-jtable/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top