Zielony Smok - logo witryny

Prezentacja macierzy jako JTable

Aby móc wyświetlić macierz jako JTable musimy przygotować:

  • Klasę MatrixReenderer
  • Klasę MatrixTableModel
  • metodę showAsJTable() w klasie Matrix
  • Klasę uruchamiającą Matrix007
Klasa MatrixReenderer
package matrices;
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.text.DecimalFormat;
public class MatrixReenderer extends JLabel implements
            TableCellRenderer {
    private static final long serialVersionUID =
                 18737557295563L;
    public MatrixReenderer() {
    }
    @Override
    public Component getTableCellRendererComponent(JTable table,
           Object value,  boolean isSelected, boolean hasFocus,
            int row, int column) {
        DecimalFormat form = new DecimalFormat("##0.00");
        String str = null;
        if (value instanceof String) {
            str = (String) value;
        }
        if (value instanceof Double) {
            Double d = (Double) value;
            str = form.format(d);
        }
        if (str.startsWith("-")) {
            setForeground(Color.RED);
        } else {
            setForeground(Color.BLACK);
        }
        this.setHorizontalAlignment(JLabel.RIGHT);
        setText(str);
        return this;
    }
}
Klasa MatrixTableModel
package matrices;
import javax.swing.table.AbstractTableModel;
import java.text.DecimalFormat;
public class MatrixTableModel extends AbstractTableModel {
    private static final long serialVersionUID =
            -443758665172380994L;
    private final Object[][] array;
    public MatrixTableModel(double[][] tabl) {
        array = new Object[tabl.length][tabl[0].length];
        for (int i = 0; i < tabl.length; i++) {
            for (int j = 0; j < tabl[0].length; j++) {
                array[i][j] = tabl[i][j];
            }
        }
    }
    @Override
    public int getRowCount() {
        return array.length;
    }
    @Override
    public boolean isCellEditable(int row, int column) {
        return true;
    }
    @Override
    public int getColumnCount() {
        return array[0].length;
    }
    @Override
    public Object getValueAt(int row, int col) {
        return array[row][col];
    }
    @Override
    public void setValueAt(Object value, int r, int c) {
        DecimalFormat form = new DecimalFormat("##0.00");
        Double val = Double.valueOf((String) value);
        array[r][c] = form.format(val);
        this.fireTableCellUpdated(r, c);
    }
}
Metoda showAsJTable() w klasie Matrix
 public void showAsJTable() {
        JFrame frame = new JFrame();
        JTable table = new JTable();
        JScrollPane sp = new JScrollPane(table);
        MatrixTableModel mtm = new MatrixTableModel(array);
        table.setDefaultRenderer(Object.class, new
                MatrixReenderer());
        table.setModel(mtm);
        frame.add(sp);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Matrix");
        frame.pack();
        frame.setVisible(true);
    }
Klasa uruchamiającą Matrix007

Tworzymy macierz. Wyświetlamy macierz jako JTable. Nie ustawialiśmy wielkości ramki. Wartości ujemne wyświetlane są na czerwono.

 double[][] tabl = {{1, -2, 3}, {4, -5, 6},
           {7, -8, 9}};
        Matrix matrix = new Matrix(tabl);
        matrix.showAsJTable();

Po uruchomieniu klasy zobaczymy:

Macierz jako JTable
Rys. 278. Macierz jako JTable

Pliki do ściągnięcia

matrices026.zip

Moduł matrices – aktualny stan projektu = 026;