Pergunta

Então, eu quero escrever um Matrix Explorer que me permita reordenar linhas e colunas de uma matriz. Para esta porpouse, usei a classe jtable. Agora, o problema que tenho é que é muito difícil reordenar uma matriz olhando valores duplos, por isso gostaria de imprimir a matriz não com os valores duplos, mas com círculos em que o raio do círculo representa o valor. Para que eu possa dizer a diferença entre grandes valores e pequenos valores mais rápidos.

Alguém tem alguma idéia de como posso transformar esses valores duplos em círculos preenchidos com a classe JTable ou qualquer tabela para esse assunto?

Foi útil?

Solução

Aqui está um exemplo de um renderizador personalizado que implementa o Icon interface para fazer o desenho. Essa abordagem permite o controle mais fácil do posicionamento relativo do texto e do ícone. Observe que o renderizador escala com base na suposição de valores normalizados no intervalo [0, 1); Você pode consultar seu modelo de dados para os valores mínimo e máximo.

icon renderer

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

Outras dicas

Você terá que escrever seu costume Renderizador de células.

O componente será usado como carimbo de borracha; a paint O método é chamado para cada célula.

Desenhe o círculo no método de pintura;

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

Vai desenhar um círculo de radius com ponto central em (x,y).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top