1

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

3 に答える 3

2

余談canDisplay(int)ですが、特定のコードポイントが特定のにグリフを持っているかどうかを判断するのに役立つ場合がありますFontREPLACEMENT CHARACTERは便利なプレースホルダーでありGlyphSet、関連する例です。

于 2012-01-23T07:40:42.940 に答える
2

1)Unicodeシャアくらいありますが、それは仕事じゃないと思いますRenderer

2)パラメータを渡すのではなく、JTableにJTable#Fontを設定します。Renderer

3)prepareRendererランタイムで大量のデータを変更する場合に使用します

4)最も重要なのは、データをどのように入力JTable'sし、定義/設定したかを確認することですFont(s)

于 2012-01-23T07:22:22.070 に答える
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;
    }
}
于 2012-01-23T07:29:50.830 に答える