如何在表中添加行标题?

m1m5dgzv  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(411)

我找不到向表中添加行标题的解决方案。使用水平标题一切正常,但是如何将垂直标题(行标题)设置为左侧?以下是我目前拥有的代码:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. public class Table{
  4. public static void main(String[] args) {
  5. int n = 5;
  6. int m = 5;
  7. String[][] arrayList = new String[n][m];
  8. String[] horizontalHeader = new String[n];
  9. String[] verticalHeader = new String[n];
  10. for (int i = 0; i < n; i++) {
  11. horizontalHeader[i] = "column" + i;
  12. verticalHeader[i] = "row" + i;
  13. }
  14. for (int i = 0; i < n; i++) {
  15. for (int j = 0; j < m; j++) {
  16. arrayList[i][j] = "value";
  17. }
  18. }
  19. JFrame frame = new JFrame("Table");
  20. JTable table = new JTable(arrayList, horizontalHeader);
  21. JScrollPane scrollPane = new JScrollPane(table);
  22. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  23. frame.add(scrollPane, BorderLayout.CENTER);
  24. frame.setSize(500, 500);
  25. frame.setVisible(true);
  26. }
  27. }

ig9co6j1

ig9co6j11#

创建一个组件并将该组件添加到 JScrollPane 使用 setRowHeaderView(...) 方法。
所以你可以用 JList 作为包含每行值的组件。
您还需要一个自定义的呈现器,以便行标题像列标题一样呈现。
下面是一个基本示例,每行仅使用一个数字:

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import javax.swing.event.*;
  5. import javax.swing.table.*;
  6. public class TableRowHeader extends JList implements TableModelListener
  7. {
  8. private JTable table;
  9. @SuppressWarnings("unchecked")
  10. public TableRowHeader(JTable table)
  11. {
  12. this.table = table;
  13. setAutoscrolls( false );
  14. setCellRenderer(new RowHeaderRenderer());
  15. setFixedCellHeight(table.getRowHeight());
  16. setFixedCellWidth(50);
  17. setFocusable( false );
  18. setModel( new TableListModel() );
  19. setOpaque( false );
  20. setSelectionModel( table.getSelectionModel() );
  21. table.getModel().addTableModelListener( this );
  22. }
  23. public void tableChanged(TableModelEvent e)
  24. {
  25. if (e.getType() == TableModelEvent.INSERT
  26. || e.getType() == TableModelEvent.DELETE)
  27. {
  28. repaint();
  29. }
  30. }
  31. /*
  32. * Use the table to implement the ListModel
  33. */
  34. class TableListModel extends AbstractListModel
  35. {
  36. public int getSize()
  37. {
  38. return table.getRowCount();
  39. }
  40. public Object getElementAt(int index)
  41. {
  42. return String.valueOf(index + 1);
  43. }
  44. }
  45. /*
  46. * Use the table row header properties to render each cell
  47. */
  48. class RowHeaderRenderer extends DefaultListCellRenderer
  49. {
  50. RowHeaderRenderer()
  51. {
  52. setHorizontalAlignment(CENTER);
  53. setOpaque(true);
  54. setBorder(UIManager.getBorder("TableHeader.cellBorder"));
  55. setFont(table.getTableHeader().getFont());
  56. setBackground(table.getTableHeader().getBackground());
  57. setForeground(table.getTableHeader().getForeground());
  58. }
  59. public Component getListCellRendererComponent(
  60. JList list, Object value, int index,
  61. boolean isSelected, boolean cellHasFocus)
  62. {
  63. if (isSelected)
  64. {
  65. setBackground( table.getSelectionBackground() );
  66. }
  67. else
  68. {
  69. setBackground( table.getTableHeader().getBackground() );
  70. }
  71. setText( (value == null) ? "" : value.toString() );
  72. return this;
  73. }
  74. }
  75. private static void createAndShowUI()
  76. {
  77. JTable table = new JTable( 1000, 10 );
  78. JScrollPane scrollPane = new JScrollPane( table );
  79. scrollPane.setRowHeaderView( new TableRowHeader( table) );
  80. JFrame frame = new JFrame("Row Header Test");
  81. frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  82. frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
  83. frame.pack();
  84. frame.setLocationRelativeTo( null );
  85. frame.setVisible(true);
  86. }
  87. public static void main(String[] args)
  88. {
  89. EventQueue.invokeLater(new Runnable()
  90. {
  91. public void run()
  92. {
  93. createAndShowUI();
  94. }
  95. });
  96. }
  97. }

如果您希望行标题中有不同的值,那么可以使用您自己的包含要显示的值的listmodel,而不是tablelistmodel。
如果可以从tablemodel中动态添加/删除数据行,那么还需要逻辑来添加/删除listmodel中的行。

展开查看全部

相关问题