1

我用多行单元格制作了一个表格,效果很好,但是我想在制作特定的列多行单元格后更改单行的颜色,而不是整个列的颜色。我怎样才能做到这一点?

这是制作第 2 列多行单元格后的图像,但整个列变成白色 在此处输入图像描述

这就是我所做的:

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);

这是 TextAreaRenderer2 类:

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;
     }
 }
4

2 回答 2

1

在您的TableAreaRenderer2课程中,getTableCellRendererComponent您应该在方法中根据行设置背景颜色。像这样的东西:

if (row % 6 < 3) {
  setBackground(Color.LIGHT_GRAY);
} else {
  setBackground(Color.WHITE);
}

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

于 2012-08-31T18:05:33.360 回答
1

这原来是这些问题之一:

  • 认为这是一个很好的问题来演示如何在自定义渲染器中获得正确的依赖于状态的视觉属性
  • 实施和测试一个简单的例子
  • 没有按预期工作
  • 启动调试会话

... 几个小时后 .. 对某些 Nimbus 的特殊性感到厌恶。

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

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 填充了一个减少了大约 2px 插图的区域(不知道为什么)。当不用于渲染时,将 opacity 设置为 true 足以使其填充整个区域。当用于渲染时,除了...将其添加到 JViewport(从而伪造状态)并将视口作为渲染组件返回(不知道为什么会有这种差异)之外,没有任何帮助。

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;
    }
}
于 2012-09-01T15:13:41.530 回答