4

そのため、マトリックスの行と列を並べ替えることができるマトリックス エクスプローラーを作成したいと考えています。このポルポスには、Jtable クラスを使用しました。今私が抱えている問題は、double 値を見て行列を並べ替えるのが非常に難しいということです。そのため、double 値ではなく、円の半径が値を表す円で行列を印刷したいと思います。大きな値と小さな値の違いをより早く見分けることができるように。

この double 値を JTable またはそのテーブルクラスを使用して塗りつぶされた円に変換する方法を知っている人はいますか?

4

2 に答える 2

11

描画を行うためのインターフェイスを実装するカスタム レンダラーの例を次に示します。Iconこのアプローチにより、テキストとアイコンの相対的な位置を簡単に制御できます。レンダラーは、 interval 内の正規化された値の仮定に基づいてスケーリングすることに注意してください[0, 1)。代わりに、データ モデルにクエリを実行して最小値と最大値を求めることができます。

アイコンレンダラー

class DecRenderer extends DefaultTableCellRenderer implements Icon {

    private static final int SIZE = 32;
    private static final int HALF = SIZE / 2;
    DecimalFormat df;

    public DecRenderer(DecimalFormat df) {
        this.df = df;
        this.setIcon(this);
        this.setHorizontalAlignment(JLabel.RIGHT);
        this.setBackground(Color.lightGray);
    }

    @Override
    protected void setValue(Object value) {
        setText((value == null) ? "" : df.format(value));
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.blue);
        double v = Double.valueOf(this.getText());
        int d = (int)(v * SIZE);
        int r = d / 2;
        g2d.fillOval(x + HALF - r, y + HALF - r, d, d);
    }

    @Override
    public int getIconWidth() {
        return SIZE;
    }

    @Override
    public int getIconHeight() {
        return SIZE;
    }
}
于 2010-05-14T13:30:14.043 に答える
3

カスタムセルレンダラーを作成する必要があります。

コンポーネントはラバースタンプとして使用されます。paintメソッドはセルごとに呼び出されます。

ペイント方法で円を描きます。

g.fillOval(x - radius / 2, y - radius / 2, radius, radius);

radiusを中心点とする円を描き(x,y)ます。

于 2010-05-14T10:51:10.293 に答える