【问题标题】:TableCellRenderer strange behaviour javaTableCellRenderer奇怪的行为java
【发布时间】:2012-02-16 14:27:12
【问题描述】:

我正在尝试在 jtable 上实现自定义 TableCellRenderer。该表设置为 100 行和 100 列。此表应包含指定字体的所有字形。我的问题是,当表格没有完全包含值时,它会在第一列上放置最后一个值,直到它到达表格的底部。下面我有我的自定义渲染器的代码和带有奇怪行为的屏幕截图。任何帮助将不胜感激。

public class FontRenderer extends JLabel implements TableCellRenderer
{
Font desired_font;
Object prec_value;

public FontRenderer(Font f)
{
    desired_font = f;
}

public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex)
{


    setOpaque(true);
    setHorizontalAlignment(SwingConstants.CENTER);
    setBackground(new Color(255, 255, 255));
    if (isSelected)
    {
        if (value == null)
        {
            setText("");
        }
        else
        {
            setText(value.toString());
        }
        setFont(desired_font);
        setBackground(new Color(56, 195, 254));
    }
    if (value == null)
    {
        setText("");
    }
    else
    {
        if(value==null)
            table.setValueAt(null, rowIndex, vColIndex);
        else
        setText(value.toString());
            //table.setValueAt(value.toString(), rowIndex, vColIndex);

    }
    setFont(desired_font);

    return this;
}
}

编辑:这是我填充表格的代码。

while (cnt_i < 100) {
    while (cnt_j < 100) {
        if (my_fnt.canDisplay((char) unicode_char) && glyph_count <= total_glyphs) {
            jTable1.setValueAt((char) unicode_char, cnt_i, cnt_j);
            cnt_j++;
            if (glyph_count == total_glyphs) {
                break;
            }
            glyph_count++;
        }
        unicode_char++;
    }
    cnt_i++;
    cnt_j = 0;
}

解决了。泰所有。这就是我填充表格的方式。以下代码有改动:

while (cnt_i < 100) {
    while (cnt_j < 100) {
        if (my_fnt.canDisplay((char) unicode_char) && glyph_count <= total_glyphs) {
            if (glyph_count == total_glyphs) {
                break;
            }
            else {
                jTable1.setValueAt((char) unicode_char, cnt_i, cnt_j);
                cnt_j++;
                glyph_count++;
            }
        }
        unicode_char++;
    }
    cnt_i++;
    cnt_j = 0;
}

【问题讨论】:

  • 即使您的渲染器非常多余,但它似乎并不是问题的根源。
  • 传递给渲染器的数据来自TableModel,所以很可能就是问题所在。请发布该代码而不是渲染代码
  • 您的代码似乎没有调用 table.setValueAt (顺便说一句,渲染器不应该改变表格的内容);所以我想问题在于表格的填充方式
  • 另见FontShower`

标签: java swing fonts jtable tablecellrenderer


【解决方案1】:

顺便说一句,canDisplay(int) 可能有助于确定特定代码点是否在给定的Font 中具有字形。 REPLACEMENT CHARACTER 是一个方便的占位符,GlyphSet 是一个相关的例子。

【讨论】:

  • while (cnt_i
  • 对此感到抱歉。似乎我无法回答我自己的问题,以便能够在 8 小时过去之前发布格式化代码。我想说的是,在我填充表格后,如果我不使用渲染器,它填充就好了。
  • 您可以更新您的问题,就像我代表您所做的那样。当然,替换你的sscce 会更有效。我猜你对TableModel 的实现是问题所在。 @mKorbel 和 @rauschen 的 +1 答案是正确的。
  • 感谢您的回复垃圾神。我查看了我的代码,但没有实现任何表模型。我的表使用 DefaultTableModel。我对该 jtable 所做的唯一事情是: jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);和 jTable1.setCellSelectionEnabled(true);现在我真的迷路了:(
  • DefaultTableModel 你的TableModel实现。
【解决方案2】:

我不认为你的问题是 CellRenderer ..

不过我帮你整理了一下

public class FontRenderer extends JLabel implements TableCellRenderer
{
    Font desired_font;
    Object prec_value;

    public FontRenderer(Font f)
    {
        desired_font = f;
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex)
    {
        setOpaque(true);
        setHorizontalAlignment(SwingConstants.CENTER);
        setBackground(new Color(255, 255, 255));
        setFont(desired_font);

        if (value == null)
        {
            setText("");
        }
        else
        {
            setText(value.toString());
        }

        if (isSelected)
        {
            setBackground(new Color(56, 195, 254));
        }

        //what was that for?
        //table.setValueAt(null, rowIndex, vColIndex);

        return this;
    }
}

【讨论】:

    【解决方案3】:

    1) 大约有Unicode 字符,我认为这不是Renderer 的工作

    2) 为JTable 设置JTable#Font 而不是为Renderer 传递参数

    3) 如果您想在运行时更改一堆数据,请使用prepareRenderer

    4) 最重要的是查看您如何填充 JTable's 数据并为 Font(s) 定义/设置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 2023-04-06
      • 2018-08-15
      • 2017-09-27
      • 2015-12-04
      • 2021-09-28
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多