我正在尝试在JTable中插入一个值。但我遇到了一些问题(设计)。当我试图添加一个值时,通常单词/换行不起作用,所以我尝试插入嵌入了HTML标记的值
<html>Value</html>
但问题是顶部会出现一些额外的空间(第一行正好位于中间)。所以我尝试使用渲染器将JTextpane添加到JTable,但它只使水平中心而不是垂直中心(Word / Line包装正常工作)。
总之我的需求是
我需要将值准确显示在单元格的中间(水平和垂直居中)
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;
}}
我的代码有什么问题,有人可以帮我纠正吗?提前致谢。
答案 0 :(得分:4)
您可以使用简单HTML
和默认TableCellRenderer
,它基于JLabel
来实现这一基本原则。
以下示例使用html
table
,它进一步将文本(断行)与标签的中心对齐。它使用horizontalAlignment
的{{1}}和verticalAlignment
属性来获取标签内对齐的内容。
行高也有点诡计;)
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
)并对文本进行后期处理