如何解决JTable 中的双行标题
我使用 table 和 jtable 编写软件让我再次感到困难。
对于单行标题我使用:
private class make_table extends AbstractTableModel {
private String[] headers = headers();
Object[][] rows = rows();
public int getColumnCount() {
return headers.length;
}
public int getRowCount() {
return rows.length;
}
public String getColumnName(int col) {
return headers[col];
}
public Object getValueAt(int row,int col) {
return rows[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0,c).getClass();
}
}
然后我只是将它传递给:
table = new JTable(new make_table());
标题();方法只返回带有列名的 String[] - 一维数组。
我试图让 headers() 重新运行二维数组 - String[][] 和 make_table String[][] 中的标题而不是 String[]。我的问题是如何在 JTable 中呈现/显示它。
我很久以前刚刚将整个方法复制粘贴到另一个项目中,但我无法理解它是如何工作的。我想我可以以某种方式使用处理行的方式,因为它是二维数组,但我无法理解它。
注意:我读过一些东西,但似乎都集中在第 1 行和第 2 行中不同数量的单元格上。我希望第一行标题有 6 个单元格,第二行也有标题 6 个单元格。
我的问题: 我怎么能进入并显示两行标题 JTable?最好通过二维数组。
解决方法
两种不同的方法:
- 使用 HTML 作为列名,并使用
<br>
标记来表示每一行 - 使用自定义渲染器将列名解析为多行
在这两种情况下,列标题的高度都将取决于第一列的行数:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableHeaderLines extends JPanel
{
public TableHeaderLines()
{
add( createHeaderUsingHTML() );
add( createHeaderUsingCustomRenderer() );
}
private JComponent createHeaderUsingHTML()
{
// the height of the header is determined by the height of the first column
Object[] columnNames =
{
"<html>Column 1<br>multi<br>line</html","Column 2","<html>Column 3<br>more</html","<html>one<br>two<br>three<br>four</html>" // lines won't display completely
};
DefaultTableModel model = new DefaultTableModel(columnNames,5);
JTable table = new JTable(model);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
return new JScrollPane( table );
}
private JComponent createHeaderUsingCustomRenderer()
{
// the height of the header is determined by the height of the first column
// the multi line renderer will only work if the first line is multi line
Object[] columnNames =
{
"Column 1,multi,line","Column 3,more","one,two,three,four" // 4th line won't display
};
DefaultTableModel model = new DefaultTableModel(columnNames,5);
JTable table = new JTable(model);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.getTableHeader().setDefaultRenderer( new LineRenderer() );
return new JScrollPane( table );
}
class LineRenderer extends JPanel implements TableCellRenderer
{
public LineRenderer()
{
setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
setOpaque( false );
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
}
public Component getTableCellRendererComponent(
JTable table,Object value,boolean isSelected,boolean hasFocus,final int row,final int column)
{
removeAll();
String[] result = ((String)value).split(",");
for (int i = 0; i < result.length; i++)
{
JLabel label = new JLabel(result[i]);
label.setFont( table.getTableHeader().getFont() );
label.setAlignmentX(0.5f);
add(label);
}
return this;
}
}
public static void createAndShowGUI()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add(new TableHeaderLines());
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
public static void main(String[] args) throws Exception
{
java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。