【问题标题】:Setting JTable column Horizontal Alignment without using DefaultTableCellRenderer在不使用 DefaultTableCellRenderer 的情况下设置 JTable 列水平对齐
【发布时间】:2016-04-28 04:18:08
【问题描述】:

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

【问题讨论】:

  • 渲染器的水平对齐是什么意思?您是指单元格对齐吗?
  • 无需调用setSizeJTable 会自行处理。将对齐更改为什么?

标签: java swing jtable tablecellrenderer


【解决方案1】:

我已经找到答案了,谢谢TT。对于提示,我只是删除了自定义构造函数及其换行符,扩展了 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;
}
}

【讨论】:

    【解决方案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 插入。

    【讨论】:

    • 这仅适用于 JTextPane,不适用于 JTextArea。
    • @camickr Hmz 好点 =) 所以回到 setAlignmentY 我想
    • @camickr 您在查看您的用户配置文件之类的事情中获得了 EXP...您认为 JTextArea 会是一个很好的扩展组件,还是扩展 JTextPane 会更好?
    • 不确定我是否真的理解 OP 想要做什么,所以我没有建议。
    • setAlignmentY 不起作用(setAlignmentX 也不起作用)
    猜你喜欢
    • 2017-10-27
    • 2016-01-26
    • 2013-06-09
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多