在不使用DefaultTableCellRenderer

时间:2016-01-21 18:47:00

标签: java swing jtable tablecellrenderer

我有以下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());

enter image description here

2 个答案:

答案 0 :(得分:2)

使用JTextArea无法做到这一点。

您的单元格渲染器应该扩展JTextPane,因此您可以从getTableCellRendererComponent实现或渲染器的构造函数调用:

StyledDocument doc = getStyledDocument();
SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
doc.setParagraphAttributes(0, doc.getLength(), center, false);

如果你想要居中。在StackOverflow上从this answer无耻地插入。

答案 1 :(得分:2)

我找到了答案,谢谢TT。对于提示,我只是删除了自定义构造函数及其linewrap,扩展了JTextPane,并添加了几行代码。 对于任何需要允许跳过线路的班级的人来说设置单元格的水平对齐,这里是代码:

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