java 在保持 JTable 默认渲染器的同时对齐 JTable 单元格中的文本?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4103114/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Align text in a JTable cell while maintaining JTable default renderer?
提问by Ben Flynn
I have a JTable that does lovely alternations in coloration thanks to this code:
由于以下代码,我有一个 JTable 可以在着色方面进行可爱的更改:
table.setDefaultRenderer(Object.class, new BorderRenderer(new ColorRenderer(table
.getDefaultRenderer(Object.class), colorProvider)));
(Here the "colorProvider" contains code that turns every other row light grey.) I have one column in which I would like to align text to center. If I simply set a DefaultCellRenderer on that column with center horizontal alignment, it overrides the table's default renderer and I lose my lovely stripes.
(这里的“colorProvider”包含将每隔一行变成浅灰色的代码。)我有一列,我想将文本居中对齐。如果我只是在该列上设置一个 DefaultCellRenderer 并居中水平对齐,它会覆盖表格的默认渲染器,并且我会丢失我可爱的条纹。
Can I keep the stripes and still change the alignment of a column?
我可以保留条纹并仍然更改列的对齐方式吗?
To further complicate things, I have the above code in a super class. It is my sub classes that know what column(s) they would like to change the alignment on.
更复杂的是,我在一个超类中有上面的代码。是我的子类知道他们想要更改对齐的列。
采纳答案by Ben Flynn
Thanks both to afk and camickr who led me to my final decision to write a TableCellRendererWrapper:
感谢 afk 和 camickr,他们让我最终决定编写 TableCellRendererWrapper:
public class ColumnAlignmentRenderer implements TableCellRenderer {
private TableCellRenderer mWrappedRenderer;
private int mDefaultAlignment = SwingConstants.LEFT;
private Map<Integer, Integer> mSpecialColumnAlignmentMap = new Hashtable<Integer, Integer>();
public ColumnAlignmentRenderer(TableCellRenderer pWrappedRenderer) {
mWrappedRenderer = pWrappedRenderer;
}
public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected,
boolean pHasFocus, int pRow, int pColumn) {
// Use the wrapped renderer
Component renderedComponent = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus,
pRow, pColumn);
// Set the alignment
Integer alignment = mSpecialColumnAlignmentMap.get(pColumn);
if (alignment != null) {
((JLabel)renderedComponent).setHorizontalAlignment(alignment);
} else {
((JLabel)renderedComponent).setHorizontalAlignment(mDefaultAlignment);
}
return renderedComponent;
}
public void setSpecialColumnAlignment(Integer pColumn, Integer pAlignment) {
mSpecialColumnAlignmentMap.put(pColumn, pAlignment);
}
public void setDefaultAlignment(int pAlignment) {
mDefaultAlignment = pAlignment;
}
}
It's not perfect, but it gets the job done for me. To use it I do this:
它并不完美,但它为我完成了工作。要使用它,我这样做:
// Center alignment for "selected" column
ColumnAlignmentRenderer cellRenderer = new ColumnAlignmentRenderer(getTable().getDefaultRenderer(Object.class));
cellRenderer.setSpecialColumnAlignment(MyTableModel.COL_TO_CENTER, SwingConstants.CENTER);
getTable().setDefaultRenderer(Object.class, cellRenderer);
// Center alignmet for "selected" column header
ColumnAlignmentRenderer headerRenderer = new ColumnAlignmentRenderer(getTable().getTableHeader().getDefaultRenderer());
headerRenderer.setSpecialColumnAlignment(MyTableModel.COL_TO_CENTER, SwingConstants.CENTER);
getTable().getTableHeader().setDefaultRenderer(headerRenderer);
回答by camickr
Can I keep the stripes and still change the alignment of a column?
我可以保留条纹并仍然更改列的对齐方式吗?
An easier approach is to use Table Row Rendering. Then you can customize the alignment of individual renderers without affecting the row colors.
更简单的方法是使用Table Row Rendering。然后您可以在不影响行颜色的情况下自定义各个渲染器的对齐方式。
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(???).setCellRenderer( centerRenderer );
回答by solidfox
use this method, it will align both header and table content to centered alignment. However you can change the CENTER to LEFT or RIGHT alignment.
使用此方法,它会将标题和表格内容对齐到居中对齐。但是,您可以将 CENTER 更改为 LEFT 或 RIGHT 对齐方式。
public void setTableAlignment(JTable table){
// table header alignment
JTableHeader header = table.getTableHeader();
DefaultTableCellRenderer renderer = (DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer();
header.setDefaultRenderer(renderer);
renderer.setHorizontalAlignment(JLabel.CENTER);
// table content alignment
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
int rowNumber = table.getColumnCount();
for(int i = 0; i < rowNumber; i++){
table.getColumnModel().getColumn(i).setCellRenderer( centerRenderer );
}
}
回答by akf
If you try to set the alignment on the default renederer that is set in your superclass's code, you will affect every cell. An option you have is to create a new subclass for either BorderRenderer
or ColorRenderer
(whichever is most appropriate), and in its getTableCellRendererComponent
get the value returned from calling super.getTableCellRendererComponent
and set the alignment on that before returning. You can then set that an instance of that renderer for the column that you need aligned.
如果您尝试在超类代码中设置的默认渲染器上设置对齐方式,则会影响每个单元格。您可以选择为BorderRenderer
或ColorRenderer
(以最合适的方式)创建一个新的子类,并在其中getTableCellRendererComponent
获取调用返回的值super.getTableCellRendererComponent
并在返回之前设置对齐。然后,您可以为需要对齐的列设置该渲染器的实例。