java - 如何在表格中添加行标题?
问题描述
我找不到将行标题添加到表中的解决方案。使用水平标题一切正常,但如何将垂直标题(行标题)设置在左侧?这是我目前拥有的代码:
import javax.swing.*;
import java.awt.*;
public class Table{
public static void main(String[] args) {
int n = 5;
int m = 5;
String[][] arrayList = new String[n][m];
String[] horizontalHeader = new String[n];
String[] verticalHeader = new String[n];
for (int i = 0; i < n; i++) {
horizontalHeader[i] = "column" + i;
verticalHeader[i] = "row" + i;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arrayList[i][j] = "value";
}
}
JFrame frame = new JFrame("Table");
JTable table = new JTable(arrayList, horizontalHeader);
JScrollPane scrollPane = new JScrollPane(table);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setSize(500, 500);
frame.setVisible(true);
}
}
解决方案
您创建一个组件并将该组件添加到JScrollPane
usingsetRowHeaderView(...)
方法。
因此,您可以使用 aJList
作为包含每行值的组件。
您还需要一个自定义渲染器,以便像列标题一样渲染行标题。
这是一个基本示例,每行只使用一个数字:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class TableRowHeader extends JList implements TableModelListener
{
private JTable table;
@SuppressWarnings("unchecked")
public TableRowHeader(JTable table)
{
this.table = table;
setAutoscrolls( false );
setCellRenderer(new RowHeaderRenderer());
setFixedCellHeight(table.getRowHeight());
setFixedCellWidth(50);
setFocusable( false );
setModel( new TableListModel() );
setOpaque( false );
setSelectionModel( table.getSelectionModel() );
table.getModel().addTableModelListener( this );
}
public void tableChanged(TableModelEvent e)
{
if (e.getType() == TableModelEvent.INSERT
|| e.getType() == TableModelEvent.DELETE)
{
repaint();
}
}
/*
* Use the table to implement the ListModel
*/
class TableListModel extends AbstractListModel
{
public int getSize()
{
return table.getRowCount();
}
public Object getElementAt(int index)
{
return String.valueOf(index + 1);
}
}
/*
* Use the table row header properties to render each cell
*/
class RowHeaderRenderer extends DefaultListCellRenderer
{
RowHeaderRenderer()
{
setHorizontalAlignment(CENTER);
setOpaque(true);
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setFont(table.getTableHeader().getFont());
setBackground(table.getTableHeader().getBackground());
setForeground(table.getTableHeader().getForeground());
}
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus)
{
if (isSelected)
{
setBackground( table.getSelectionBackground() );
}
else
{
setBackground( table.getTableHeader().getBackground() );
}
setText( (value == null) ? "" : value.toString() );
return this;
}
}
private static void createAndShowUI()
{
JTable table = new JTable( 1000, 10 );
JScrollPane scrollPane = new JScrollPane( table );
scrollPane.setRowHeaderView( new TableRowHeader( table) );
JFrame frame = new JFrame("Row Header Test");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
如果您想要在行标题中使用不同的值,那么您将使用您自己的包含您想要显示的值的 ListModel,而不是 TableListModel。
如果您可以从 TableModel 中动态添加/删除数据行,那么您还需要从 ListModel 中添加/删除行的逻辑。
推荐阅读
- swift - 实现嵌套的 UITbeViewControllers
- sql - 如何在涉及链接的 Access 中连接多行?
- python - Python:使用优化编译并执行
- android - 由 java.lang.SecurityException 引起:uid ... 无法显式添加以下类型的帐户:... Android P 和 Android 10
- javascript - 如何更新从 javascript 中的 fs 读取的 fs 中的 json 值?
- c# - 如何在 WinForms DataGrid 中绘制所选行的边框?
- flutter - 可迭代
模拟 - ios - 如何在 SwiftUI iOS 中禁用列表滚动?
- android - Gradle 同步失败:包装器属性文件中没有指定键“distributionUrl”的值
- c# - 删除按钮在列表视图中删除,但不在对象列表中