gpt4 book ai didi

java - JTextPane 中的垂直和水平对齐

转载 作者:行者123 更新时间:2023-12-01 18:12:31 27 4
gpt4 key购买 nike

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

<html>Value</html>

但问题是顶部出现了一些额外的空间(第一行正好位于中间)。因此,我尝试使用渲染器将 JTextpane 添加到 JTable,但它仅使水平居中而不是垂直居中(文字/换行工作正常)。

简而言之,我的需求是

  1. 我需要在 JTable 中输入一个值。
  2. 如果超出列宽,我需要进行换行。
  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;
    }}

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

最佳答案

您可以仅使用纯 HTML 和默认的 TableCellRenderer(它基于 JLabel)来实现此基本原则。

以下示例使用 html table,它进一步将文本(断行)与标签的中心对齐。它使用 JLabelhorizo​​ntalAlignmentverticalAlignment 属性来使内容在标签内对齐。

它还对行高做了一些处理;)

Table with html

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(使用 DefaultTableCellRenderer)并根据您的需要对文本进行后换行

关于java - JTextPane 中的垂直和水平对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31912426/

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