Java JTable 行头实现

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1434933/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 12:14:43  来源:igfitidea点击:

JTable Row Header Implementation

javaswingjtable

提问by Leandro Lima

How can I create a JTable with a row header?

如何创建带有行标题的 JTable?

This question seems simple and I could find a lot of tips with Google searches. Nevertheless, everything I have found were tips of how make a column which mimics the real header. Although this is good, it comes with the problem of that the look and feel can not be applied very well.

这个问题看起来很简单,我可以通过 Google 搜索找到很多提示。尽管如此,我发现的一切都是关于如何制作模仿真实标题的列的提示。这虽然很好,但随之而来的问题是观感不能很好地应用。

采纳答案by Leandro Lima

to resolve my problem I simply return as my renderer to the row header a header already with the title I want. Let me explain, I create a table, with the header, get the header and return it as my renderer.

为了解决我的问题,我只需将渲染器作为我的渲染器返回到行标题,一个已经带有我想要的标题的标题。让我解释一下,我创建了一个带有标题的表,获取标题并将其作为我的渲染器返回。

Thanks! Leandro

谢谢!莱安德罗

回答by albfan

try this. The code was taken from here and there, but it works reasonably well.

尝试这个。代码是从这里和那里获取的,但它运行得相当好。

It is a JTable with a redimensionable rowHeader (drag mouse between header rows to resize, as usual with columns)

它是一个 JTable,带有一个可重新定义的 rowHeader(在标题行之间拖动鼠标来调整大小,像往常一样使用列)

It ask for an image path to show the repaint while resizing (works well)

它要求图像路径在调整大小时显示重绘(效果很好)

$ java JTableRowHeader /path/to/image.gif

This is the code

这是代码

import javax.swing.;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import java.awt.;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Vector;

/** * JTable redimensionable * User: alberto * Date: 23/01/13 * Time: 1:04 */ public class 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; } }

}

}

comment lines about image path if you don't care about that.

如果您不在乎,请对图像路径进行注释。

Here is the result:

结果如下:

Screenshot of JTableRowHeader

JTableRowHeader 的屏幕截图