Java 如何正确计算jTable行的高度,以确保包含HTML的jLabel完全显示出来?

Java 如何正确计算jTable行的高度,以确保包含HTML的jLabel完全显示出来?,java,swing,Java,Swing,我有一个JTable实例,包含许多行。此表中的列是包含HTML格式字符串的JLabel实例 我的要求之一是显示这些列中的所有数据。如果列宽(无论出于何种原因)不够宽,无法显示所有数据,则文本应换行到下一行。目前文本刚刚被删除 这段代码说明了问题: import javax.swing.JFrame; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class TableTest {

我有一个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); } } 导入javax.swing.JFrame; 导入javax.swing.JTable; 导入javax.swing.table.DefaultTableModel; 公共类表格测试{ 公共静态void main(最终字符串[]args){ 最终JTable JTable=新JTable(); setModel(新的DefaultTableModel(){ 私有静态最终长serialVersionUID=1L; @凌驾 公共对象getValueAt(最终整数行,最终整数列){ 最终StringBuffer sb=新StringBuffer(); 某人加上(“”); sb.追加(“此文本为红色”); sb.append(“此文本为绿色!”); 某人加上(“”); 使某人返回字符串(); } @凌驾 public int getColumnCount(){ 返回2; } @凌驾 public int getRowCount(){ 返回2; } }); 最终JFrame JFrame=新JFrame(); jFrame.getContentPane().add(jTable); jFrame.setSize(120,80); jFrame.pack(); jFrame.setTitle(“表格测试”); jFrame.setLocationRelativeTo(空); 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;
        }
    }
}
import javax.swing.*;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableCellRenderer;
导入java.awt.*;
公共类共享空间{
公共静态void main(最终字符串[]args){
最终JTable JTable=新JTable();
setModel(新的DefaultTableModel(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共对象getValueAt(最终整数行,最终整数列){
最终StringBuffer sb=新StringBuffer();
某人加上(“”);
sb.追加(“此文本为红色”);
sb.append(“此文本为绿色!”);
某人加上(“”);
使某人返回字符串();
}
@凌驾
public int getColumnCount(){
返回2;
}
@凌驾
public int getRowCount(){
返回2;
}
});
jTable.getColumnModel().getColumn(0.setCellRenderer)(新的MyTableCellRenderer());
jTable.getColumnModel().getColumn(1.setCellRenderer)(新的MyTableCellRenderer());
最终JFrame JFrame=新JFrame();
jFrame.getContentPane().add(jTable);
jFrame.setSize(120,80);
jFrame.pack();
jFrame.setTitle(“表格测试”);
jFrame.setLocationRelativeTo(空);
jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
私有静态类MyTableCellRenderer扩展了JLabel,实现了TableCellRenderer{
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
setText(String.valueOf(value));
table.setRowHeight(行,getPreferredSize().height);
归还这个;
}
}
}
不过,我认为我的解决方案存在一个问题——每行中最后一个要更新的列最终将是唯一一个对行高有发言权的列。我把解决这个问题留给读者做练习。:-)