Java JTable中多行单元格的背景

Java JTable中多行单元格的背景,java,swing,jtable,nimbus,Java,Swing,Jtable,Nimbus,我用多行单元格创建了一个表格,效果很好,但我想在创建特定的列muliline单元格后更改单行的颜色,而不是整个列的颜色。我该怎么做 这是制作Column 2多行单元格后的图像,但整个Column变为白色 这就是我所做的: jTable1.getColumnModel().getColumn(1).setCellRenderer( new TextAreaRenderer2()); String test = "sunday \n monday "; jTable1.getModel().

我用多行单元格创建了一个表格,效果很好,但我想在创建特定的列muliline单元格后更改单行的颜色,而不是整个列的颜色。我该怎么做

这是制作Column 2多行单元格后的图像,但整个Column变为白色

这就是我所做的:

jTable1.getColumnModel().getColumn(1).setCellRenderer( new TextAreaRenderer2()); 

String test = "sunday \n monday ";

jTable1.getModel().setValueAt(test, 0, 3);
jTable1.getModel().setValueAt(test, 0, 1);
jTable1.getModel().setValueAt(test, 0, 2);
这是TextAreaRender2类:

public class TextAreaRenderer2 extends JTextArea
     implements TableCellRenderer {

     public TextAreaRenderer2() {

         Font font = new Font("Aparajita", Font.BOLD + Font.ITALIC, 16);

         setLineWrap(true);
         setWrapStyleWord(true);
         setBackground(Color.yellow);
         setBorder(BorderFactory.createEmptyBorder());
         setFont(font);

     } 

     @Override
     public Component getTableCellRendererComponent(JTable jTable,
          Object obj, boolean isSelected, boolean hasFocus, int row,
          int column) {

         setText((String)obj);
         setBackground(Color.WHITE);


         return this;
     }
 }

TableAreaRender2
类中,在
GetTableCellRenderComponent
方法中,应根据行设置背景色。大概是这样的:

if (row % 6 < 3) {
  setBackground(Color.LIGHT_GRAY);
} else {
  setBackground(Color.WHITE);
}
if(第%6行<3行){
立根背景(颜色:浅灰色);
}否则{
挫折地面(颜色:白色);
}

上述代码将使3行浅灰色,下3行白色,并重复相同的模式。

这是问题之一:

  • 认为演示如何在自定义渲染器中获得正确的依赖于状态的视觉属性是一个不错的问题
  • 实现和测试一个快速示例
  • 这不符合预期
  • 启动调试会话
。。。几个小时后。。对灵气的特殊性感到厌恶

从要做的正确事情开始:在自定义渲染器(任何类型)中,引用表的默认渲染器,并使用默认渲染器的属性配置自定义渲染组件。这样,您将看到自定义渲染器组件与默认组件(选定、条带化、焦点…)外观相同,只是希望显式不同的状态

public static class TextAreaRenderer2 extends JTextArea implements
        TableCellRenderer {

    private TableCellRenderer delegate;

    public TextAreaRenderer2(TableCellRenderer delegate) {
        this.delegate = delegate;
        // initial config
        Font font = new Font("Aparajita", Font.BOLD + Font.ITALIC, 16);
        setFont(font);
        setLineWrap(true);
        setWrapStyleWord(true);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        // configure content
        setText((String) value);
        // get a configured component from the delegate
        Component comp = delegate.getTableCellRendererComponent(table, 
                value, isSelected, hasFocus, row, column);
        // configure myself as appropriate
        setBackground(comp.getBackground());
        setForeground(comp.getForeground());
        setBorder(((JComponent) comp).getBorder());
        return this;
    }
}
这看起来很好,在每个核心LAF。。。除了Nimbus:在这一行中,我们在区域周围有一个小的白色边框,带有交替的颜色。乍一看就像是一个不透明度缺陷,哦,是的-忘记显式地将不透明度设置为true

// initial config
...
setOpaque = true;
现在我们在正常颜色的行中的区域周围有一个小的深色边框。奇怪的是,视口的颜色是黑色-

在一天结束时(跳过时间:-),结果发现Nimbus中的textArea有一个特殊的ui状态NOTINSCROLLPANE。在这种状态下,TextAreaPainter填充的区域减少了约2倍的插入(不知道为什么)。在渲染中不使用时,将“不透明度”设置为true足以使其填充整个区域。当用于渲染时,除了。。。将其添加到JViewport(从而伪造状态)并将视口作为渲染组件返回(不知道为什么会有这种差异)


好的,我会的。还有一件事,如何对齐单元格中心的文本???返回的组件必须是您需要对齐文本的JLabel。+1很高兴我在周末没有开始讨论这个问题;-)
public static class TextAreaRenderer2 extends JTextArea implements
        TableCellRenderer {

    private TableCellRenderer delegate;
    JComponent parent;
    public TextAreaRenderer2(TableCellRenderer delegate) {
        this.delegate = delegate;
        // initial config
        Font font = new Font("Aparajita", Font.BOLD + Font.ITALIC, 16);
        setFont(font);
        setLineWrap(true);
        setWrapStyleWord(true);
        parent = new JViewport();
        parent.add(this);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        // configure content
        setText((String) value);
        // get a configured component from the delegate
        Component comp = delegate.getTableCellRendererComponent(table, 
                value, isSelected, hasFocus, row, column);
        // configure myself as appropriate
        setBackground(comp.getBackground());
        setForeground(comp.getForeground());
        setBorder(((JComponent) comp).getBorder());
        // return the viewport we are added to
        return parent;
    }
}