JTextPane

时间:2015-08-10 05:51:55

标签: java swing jtable jtextpane text-alignment

我正在尝试在JTable中插入一个值。但我遇到了一些问题(设计)。当我试图添加一个值时,通常单词/换行不起作用,所以我尝试插入嵌入了HTML标记的值

<html>Value</html>

但问题是顶部会出现一些额外的空间(第一行正好位于中间)。所以我尝试使用渲染器将JTextpane添加到JTable,但它只使水平中心而不是垂直中心(Word / Line包装正常工作)。

总之我的需求是

  1. 我需要在JTable中输入一个值。
  2. 如果超过列宽,我需要Word / Line Wrap。
  3. 我需要将值准确显示在单元格的中间(水平和垂直居中)

    class TableCellLongTextRenderer extends JTextPane implements TableCellRenderer {    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        this.setText((String) value);
        StyledDocument doc = this.getStyledDocument();
        SimpleAttributeSet center = new SimpleAttributeSet();
        StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
        StyleConstants.setSpaceAbove(center, StyleConstants.getSpaceBelow(center) / 2);
        StyleConstants.setSpaceBelow(center, StyleConstants.getSpaceAbove(center));
        doc.setParagraphAttributes(0, doc.getLength(), center, false);
        return this;
    }}
    

    我的代码有什么问题,有人可以帮我纠正吗?提前致谢。

1 个答案:

答案 0 :(得分:4)

您可以使用简单HTML和默认TableCellRenderer,它基于JLabel来实现这一基本原则。

以下示例使用html table,它进一步将文本(断行)与标签的中心对齐。它使用horizontalAlignment的{​​{1}}和verticalAlignment属性来获取标签内对齐的内容。

行高也有点诡计;)

Table with html

JLabel

现在,我预先包装了我的文本并将其应用到模型中。您可以根据需要创建自定义import java.awt.Component; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.DefaultTableModel; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } String text = "<html><div align=center>" + "And Caesar's spirit, raging for revenge,<br>" + "With Ate by his side come hot from hell,<br>" + "Shall in these confines with a monarch's voice<br>" + "Cry \"Havoc!\" and let slip the dogs of war,<br>" + "That this foul deed shall smell above the earth<br>" + "With carrion men, groaning for burial."; DefaultTableModel model = new DefaultTableModel(0, 1); model.addRow(new String[]{text}); JTable table = new JTable(model) { @Override public int getRowHeight(int row) { Component comp = prepareRenderer(getCellRenderer(row, 0), row, 0); return comp.getPreferredSize().height; } }; ((JLabel)table.getDefaultRenderer(Object.class)).setHorizontalAlignment(JLabel.CENTER); ((JLabel)table.getDefaultRenderer(Object.class)).setVerticalAlignment(JLabel.CENTER); table.setRowHeight(100); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } } (使用TableCellRenderer)并对文本进行后期处理