gpt4 book ai didi

java - 如何正确计算 jTable 行的高度以确保完全显示包含 HTML 的包含的 jLabel?

转载 作者:行者123 更新时间:2023-11-30 06:37:29 25 4
gpt4 key购买 nike

我有一个 JTable 实例,其中包含许多行。此表中的列是包含 HTML 格式字符串的 JLabel 实例。

我的一个要求是应该显示这些列中的所有数据。如果列宽(无论出于何种原因)不足以显示所有数据,则文本应换行到下一行。目前,文本刚刚被截断。

这段代码说明了问题:

import javax.swing.JFrame;import javax.swing.JTable;import javax.swing.table.DefaultTableModel;public class TableTest { public static void main(final String[] args) {  final JTable jTable = new JTable();  jTable.setModel(new DefaultTableModel() {   private static final long serialVersionUID = 1L;   @Override   public Object getValueAt(final int row, final int column) {    final StringBuffer sb = new StringBuffer();    sb.append("<html>");    sb.append("<font color=\"red\">this text is red</font> ");    sb.append("<font color=\"green\">this text is green!</font>");    sb.append("</html>");    return sb.toString();   }   @Override   public int getColumnCount() {    return 2;   }   @Override   public int getRowCount() {    return 2;   }  });  final JFrame jFrame = new JFrame();  jFrame.getContentPane().add(jTable);  jFrame.setSize(120, 80);  jFrame.pack();  jFrame.setTitle("Table test");  jFrame.setLocationRelativeTo(null);  jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  jFrame.setVisible(true); }}

运行上面的 SSCCE 时,我的问题可能会变得更加清楚。如果调整 JFrame 的大小,我希望自动修改行高以允许显示 JPanel 的全部内容。

由于 HTML 的要求,我无法使用 JTextArea。

谢谢,

最佳答案

这对周五早上来说是一个很好的挑战。

答案是使用自定义的 TableCellRenderer 动态更新表格高度:

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import java.awt.*;

public class ScratchSpace {


public static void main(final String[] args) {

final JTable jTable = new JTable();

jTable.setModel(new DefaultTableModel() {
private static final long serialVersionUID = 1L;

@Override
public Object getValueAt(final int row, final int column) {
final StringBuffer sb = new StringBuffer();
sb.append("<html>");
sb.append("<font color=\"red\">this text is red</font> ");
sb.append("<font color=\"green\">this text is green!</font>");
sb.append("</html>");
return sb.toString();
}

@Override
public int getColumnCount() {
return 2;
}

@Override
public int getRowCount() {
return 2;
}
});


jTable.getColumnModel().getColumn(0).setCellRenderer(new MyTableCellRenderer());
jTable.getColumnModel().getColumn(1).setCellRenderer(new MyTableCellRenderer());
final JFrame jFrame = new JFrame();
jFrame.getContentPane().add(jTable);
jFrame.setSize(120, 80);
jFrame.pack();
jFrame.setTitle("Table test");
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);

}

private static class MyTableCellRenderer extends JLabel implements TableCellRenderer {

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setText(String.valueOf(value));
table.setRowHeight(row, getPreferredSize().height);
return this;
}
}
}

不过我认为我的解决方案存在问题 - 每行中要更新的最后一列最终将是唯一对行高有发言权的列。我将解决该问题作为读者的练习。 :-)

关于java - 如何正确计算 jTable 行的高度以确保完全显示包含 HTML 的包含的 jLabel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3476407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com