Java 如何在JTable单元格中集中一个值?

Java 如何在JTable单元格中集中一个值?,java,swing,jtable,Java,Swing,Jtable,如何在JTable单元格中居中设置值?我正在使用Netbeans。您需要自定义渲染器。要使第一列居中,可以执行以下操作: DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); centerRenderer.setHorizontalAlignment( JLabel.CENTER ); table.getColumnModel().getColumn(0).setCellRenderer( center

如何在
JTable
单元格中居中设置值?我正在使用Netbeans。

您需要自定义渲染器。要使第一列居中,可以执行以下操作:

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(0).setCellRenderer( centerRenderer );
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.setDefaultRenderer(String.class, centerRenderer);
要使用字符串数据将所有列居中,可以执行以下操作:

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(0).setCellRenderer( centerRenderer );
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.setDefaultRenderer(String.class, centerRenderer);

另一种使所有列居中的好方法是使用循环:

 for(int x=0;x<numberofcols;x++){
         table1.getColumnModel().getColumn(x).setCellRenderer( centerRenderer );
        }

对于(int x=0;x而不是
JLabel.CENTER
,您可以使用
SwingConstants.CENTER
我遇到了类似的问题。我希望根据另一个单元格的值对齐单个单元格。如果单元格x为空,则单元格Y应右对齐。否则,单元格Y应左对齐

我发现这个解决方案非常有用。它包括创建自定义渲染,扩展DefaultTableCellRender

代码如下:

public class MyRender extends DefaultTableCellRenderer{

@Override
 public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column){
    super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
    MyTableModel mtm = (MyTableModel)table.getModel();
    switch(column){
        case Y : 
            if(mla.getValueAt(row,X)!=null)
                setHorizontalAlignment(SwingConstants.RIGHT);
            else
                setHorizontalAlignment(SwingConstants.LEFT);
            break;
     }
    return this;
   }

 }
在此之后,只需创建MyRender的一个新实例并将其设置为Y列,在本例中,我是在表中加载信息时执行此操作的

MyRender render = new MyRender();
table.getColumnModel().getColumn(Y).setCellRender(render);
希望有用!

给你:

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableModel;

public class JTableUtilities
{
    public static void setCellsAlignment(JTable table, int alignment)
    {
        DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
        rightRenderer.setHorizontalAlignment(alignment);

        TableModel tableModel = table.getModel();

        for (int columnIndex = 0; columnIndex < tableModel.getColumnCount(); columnIndex++)
        {
            table.getColumnModel().getColumn(columnIndex).setCellRenderer(rightRenderer);
        }
    }
}
此代码以jtable为中心

DefaultTableCellRenderer rendar = new DefaultTableCellRenderer();
    rendar.setHorizontalAlignment(jLabel1.CENTER);

    jTable1.getColumnModel().getColumn(0).setCellRenderer(rendar); 

此代码指向列中心

您必须在单元格内使用其他组件,例如JLabel,以便它具有对齐属性。这对我不起作用。JLabel.RIGHT对齐右,JLabel.LEFT对齐左,但如果我使用JLabel.center,它将再次向右对齐。为什么会这样?@nawara,JTableHeader有自己的渲染器。尽管它是一个旧帖子,但还是应该更好。你应该使用
SwingConstants.CENTER
而不是
JLabel.CENTER
。虽然,
JLabel.CENTER'也指的是
SwingConstants.CENTER
,但使用泛型常量类要简洁得多,而不是
JLabel`在这种情况下是断章取义的。为什么不
((DefaultTableCellRenderer)table.getDefaultRenderer(String.class)).setHorizontalAlignment(SwingConstants.CENTER);
可以代替你的第二段代码吗?--我已经试过了,它不起作用,我不知道为什么。没有错误,它只是保持不居中。在我看来,这一行应该可以工作。当然,你的代码可以工作。@Ironluca如果数据在TableModel中-所有数据都在TableModel中。
getColumnClass(…)的默认实现默认TableModel的
方法只返回Object.class,因此您是正确的。但是,标准做法是重写
getColumnClass(…)
方法以返回正确的列类,以便可以使用适当的呈现器。这完全相同;-)