在不使用 DefaultTableCellRenderer 的情况下设置 JTable 列水平对齐
Setting JTable column Horizontal Alignment without using DefaultTableCellRenderer
我有以下 TableCellRenderer
(不是 DefaultTableCellRenderer
),它允许我在 JTable
的单元格中跳过行:
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
public class MyCellRenderer extends JTextArea implements TableCellRenderer {
Color highlightBackground = (Color) UIManager.get("Table.selectionBackground");
public MyCellRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setText((String) value); //or something in value, like value.getNote()...
setSize(table.getColumnModel().getColumn(column).getWidth(), getPreferredSize().height);
if (table.getRowHeight(row) != getPreferredSize().height) {
table.setRowHeight(row, getPreferredSize().height);
}
if (table.isRowSelected(row)) {
this.setBackground(highlightBackground);
} else {
this.setBackground(Color.WHITE);
}
return this;
}
}
我只想更改此渲染器的水平对齐方式。 (这意味着单元格的中心或右侧会有文本,现在是左侧)。
以下是我使用此 TableCellRenderer 的方式:
Table.getColumnModel().getColumn(1).setCellRenderer(new MyCellRenderer());
JTextArea 无法做到这一点。
您的单元格渲染器应该扩展 JTextPane,因此您可以从 getTableCellRendererComponent
实现或渲染器的构造函数中调用:
StyledDocument doc = getStyledDocument();
SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
doc.setParagraphAttributes(0, doc.getLength(), center, false);
如果你想居中。无耻地从 Whosebug 上的 this answer 插入。
找到答案了,谢谢TT。对于提示,我只是删除了自定义构造函数及其换行符,扩展了 JTextPane,并添加了几行代码。
对于任何需要允许跳过行和设置单元格水平对齐的 class 的人,这里是代码:
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class MyCellRenderer extends JTextPane implements TableCellRenderer {
Color highlightBackground = (Color) UIManager.get("Table.selectionBackground");
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setText((String) value);//or something in value, like value.getNote()...
setSize(table.getColumnModel().getColumn(column).getWidth(),
getPreferredSize().height);
if (table.getRowHeight(row) != getPreferredSize().height) {
table.setRowHeight(row, getPreferredSize().height);
}
if (table.isRowSelected(row)) {
this.setBackground(highlightBackground);
} else {
this.setBackground(Color.WHITE);
}
//Added lines
StyledDocument doc = this.getStyledDocument();
SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
doc.setParagraphAttributes(0, doc.getLength(), center, false);
//Added Lines
return this;
}
}
我有以下 TableCellRenderer
(不是 DefaultTableCellRenderer
),它允许我在 JTable
的单元格中跳过行:
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
public class MyCellRenderer extends JTextArea implements TableCellRenderer {
Color highlightBackground = (Color) UIManager.get("Table.selectionBackground");
public MyCellRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setText((String) value); //or something in value, like value.getNote()...
setSize(table.getColumnModel().getColumn(column).getWidth(), getPreferredSize().height);
if (table.getRowHeight(row) != getPreferredSize().height) {
table.setRowHeight(row, getPreferredSize().height);
}
if (table.isRowSelected(row)) {
this.setBackground(highlightBackground);
} else {
this.setBackground(Color.WHITE);
}
return this;
}
}
我只想更改此渲染器的水平对齐方式。 (这意味着单元格的中心或右侧会有文本,现在是左侧)。
以下是我使用此 TableCellRenderer 的方式:
Table.getColumnModel().getColumn(1).setCellRenderer(new MyCellRenderer());
JTextArea 无法做到这一点。
您的单元格渲染器应该扩展 JTextPane,因此您可以从 getTableCellRendererComponent
实现或渲染器的构造函数中调用:
StyledDocument doc = getStyledDocument();
SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
doc.setParagraphAttributes(0, doc.getLength(), center, false);
如果你想居中。无耻地从 Whosebug 上的 this answer 插入。
找到答案了,谢谢TT。对于提示,我只是删除了自定义构造函数及其换行符,扩展了 JTextPane,并添加了几行代码。 对于任何需要允许跳过行和设置单元格水平对齐的 class 的人,这里是代码:
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class MyCellRenderer extends JTextPane implements TableCellRenderer {
Color highlightBackground = (Color) UIManager.get("Table.selectionBackground");
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setText((String) value);//or something in value, like value.getNote()...
setSize(table.getColumnModel().getColumn(column).getWidth(),
getPreferredSize().height);
if (table.getRowHeight(row) != getPreferredSize().height) {
table.setRowHeight(row, getPreferredSize().height);
}
if (table.isRowSelected(row)) {
this.setBackground(highlightBackground);
} else {
this.setBackground(Color.WHITE);
}
//Added lines
StyledDocument doc = this.getStyledDocument();
SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
doc.setParagraphAttributes(0, doc.getLength(), center, false);
//Added Lines
return this;
}
}