Avatar billede heungsu Nybegynder
10. april 2006 - 11:24 Der er 3 kommentarer og
1 løsning

Grafisk repræsentation af tabel

Hej,

Hvis jeg har et int array[][] og vil repræsentere det grafisk hvordan skal dette gøre uden at køre utrolig langsomt? F.eks en 100x100 tabel som skal være rød hvis tallet er 0 og være blå hvis tallet er 1.

Jeg kan sagtens få det til at virke ved at lade et gridlayout med JLabels, men det tager alt for langt tid. Jeg tror jeg er ude noget rod som der findes en meget bedre løsning til.

Grunden til at det ikke må tage alt for langt tid at felter skal dynamisk opdateres ofte.

Nogle forslag? Nogle spørgsmål? På forhånd tak
Avatar billede rolchau Nybegynder
10. april 2006 - 17:02 #1
Du kunne lave lave et billede hvorpå du tegnede hver felt.

I din applikation ville du så i en tegne metode lave noget ala

for(x;arraylenght;x++) {
for(y;array.lenght;y++) {
    if(array[x][y] == 0) {
        g.setColor(Color.RED);
        g.fillRect(?*x,?*y,?,?);
    } else {
        g.setColor(Color.BLUE);
        g.fillRect(....);
    }
} //hvor g tegner på dit billede
og slutteligt tegner du dit image i draw(Graphics g) metoden.

På den måde burde der ikke være noget problem med ofte opdateringer.
Avatar billede _carsten Nybegynder
10. april 2006 - 19:50 #2
Tabllen er nok den rigtige løsning, prøv selv



import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;


public class DynamicTable extends javax.swing.JFrame {
   

    public DynamicTable() {
        initComponents();
        rows.setText("100");
        columns.setText("100");
        vis.doClick();
    }
   

    private void initComponents() {
        center = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();
        top = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        rows = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        columns = new javax.swing.JTextField();
        vis = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        center.setLayout(new java.awt.BorderLayout());

        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        table.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jScrollPane1.setViewportView(table);

        center.add(jScrollPane1, java.awt.BorderLayout.CENTER);

        getContentPane().add(center, java.awt.BorderLayout.CENTER);

        top.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 10, 5));

        jLabel1.setText("int array[][], antal r\u00e6kker:");
        top.add(jLabel1);

        rows.setColumns(6);
        top.add(rows);

        jLabel3.setText("Antal kolonner:");
        top.add(jLabel3);

        columns.setColumns(6);
        top.add(columns);

        vis.setText("Vis i tabel");
        vis.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newData(evt);
            }
        });

        top.add(vis);

        getContentPane().add(top, java.awt.BorderLayout.NORTH);

        pack();
    }

    private void newData(java.awt.event.ActionEvent evt) {
        AbstractTableModel model = new MyModel(Integer.parseInt(rows.getText()), Integer.parseInt(columns.getText()));
       
        table.setModel(model);
       
        int col = table.getColumnCount();
        TableColumnModel tcm = table.getColumnModel();
        TableColumn tc;
       
        for (int i = 0; i < col; i++) {
            tc = tcm.getColumn(i);
            tc.setCellRenderer(new MyRenderer());
        }
    }
   

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new DynamicTable().setVisible(true);
            }
        });
    }
   
    private javax.swing.JPanel center;
    private javax.swing.JTextField columns;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField rows;
    private javax.swing.JTable table;
    private javax.swing.JPanel top;
    private javax.swing.JButton vis;
}





// TableCellRenderer

class MyRenderer extends JLabel implements TableCellRenderer{
    public MyRenderer(){
        setOpaque(true);
    }
    public Component getTableCellRendererComponent(JTable table,
                                                    Object value,
                                                    boolean isSelected,
                                                    boolean hasFocus,
                                                    int row,
                                                    int column) {
       
        if(value == null)
            setText("");
        else
            setText(value.toString());
       
        setForegroundColor(value);
        setBackground(table.getBackground());
        setHorizontalAlignment(JLabel.RIGHT);
       
        return this;
    }
   
    private void setForegroundColor(Object o){
        int i = 0;
        if(o instanceof Integer){
            try{
                i = Integer.parseInt(o.toString());
                if(i <= 0)
                    setForeground(Color.red);
                else
                    setForeground(Color.black);
            }
            catch (NumberFormatException n){
                n.printStackTrace();
            }
        }
    }
}





// TableModel

class MyModel extends AbstractTableModel{
    public MyModel(int rows, int columns){
        this.rows = rows;
        this.cols = columns;
       
        data = new Object[rows][cols];
        title = new String[cols];
       
        for (int i = 0; i < cols; i++) {
            title[i] = "Kolonne " + (i + 1);
        }

        int y;
        for (int i = 0; i < rows; i++) {
            for (int x = 0; x < cols; x++) {
                y = i+x;
               
                if(y % 5 == 0)
                    y = y * -1;
                data[i][x] = new Integer(y);
            }
        }
        fireTableDataChanged();
    }

    public Class<?> getColumnClass(int columnIndex) {
        return Integer.class;
    }

    public String getColumnName(int column) {
        return title[column].toString();
    }

    public int getColumnCount() {
        return title.length;
    }
   
    public int getRowCount(){
        return data == null ? 0 : data.length;
    }
    public Object getValueAt(int row, int column) {
        return data[row][column];
    }
   
    private Object[][] data = new Object[0][0];
    private String[] title = new String[0];
   
    private int rows, cols;
}
Avatar billede heungsu Nybegynder
10. april 2006 - 21:05 #3
jeg brugte jeres foreslag som inspiriration til en løsning der virker som den skal. Tak for hjælpen. Sætter i lige et svar?

Tak
Avatar billede _carsten Nybegynder
10. april 2006 - 21:25 #4
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester