# Matrix auf Panel zeichnen



## Jino (17. Feb 2007)

Hallo Zusammen!
Ich will ein matrix von Typ double auf ein canvas/Panel.. zeichnen, wobei sich die Farbe der Werten nach ihrer grössen in einer Zelle einer Matrix ändern können.
Gibt es in java etwas schon vordefeniert,so dass man ein Matrix ohne grosse aufwand darstellen kann???

Danke im Voraus!
Alex


----------



## Wildcard (17. Feb 2007)

eine JTable?


----------



## Jino (17. Feb 2007)

Wildcard hat gesagt.:
			
		

> eine JTable?


Danke für die Rasche reaktion!

Das ist eine gute Idee, die Fragen  sind aber kann man den Header mit den Buchstaben deaktivieren? und die Zelle Rechteckig defenieren? wie kann man auf die Zelle wieder zugreifen?weil ich die Farbe nach Wertgrosse änderen, deshalb ist sinnvoll die Zelle zumerken, oder hast du  da andere Typ?

Gruss
Alex


----------



## Wildcard (17. Feb 2007)

-Die Header kannst du natürlich ausschalten
-Die Zellen SIND rechteckig  :shock: 
-Für die Sache mit der Farbe bietet sich ein eigener Renderer an


----------



## Marco13 (18. Feb 2007)

Ganz subjektiv: Wenn es nur darum geht, ein Rechtecksgitter zu zeichnen, ist eine JTable dafür IMHO ein Overkill. Spätestens, wenn man die Fraben über eigene Renderer implementieren musse, kann man sich sowas auch gleich selbst schreiben, und hat dann eine Klasse, die NUR das macht, was sie sollte, und NUR die Daten enthält, die sei braucht.


----------



## Wildcard (18. Feb 2007)

@Marco13:
Meiner Meinung nach lohnt sich die Arbeit einach nicht, da es in diesem Fall extrem einfach ist einen Renderer zu schreiben, da die Farbe (soweit ich verstanden habe) direkt von dem double Wert in der Zelle abhängt.


----------



## Marco13 (18. Feb 2007)

Ja, aber eine Klasse von JComponent abzuleiten, die einem sowas zeichnet, ist auch nicht viel schwerer  :bae: Das hat auch den Vorteil, dass man sich um viele JTable-spezifika keine Gedanken machen muss - und wenn du dir mal die JTable.java ansiehst, wird dir vielleicht auffallen, dass man damit SEHR SEHR VIEL "Mist" mit sich rumschleppt, den man in diesem Fall nicht braucht. 

Es geht sicher beides, aber wenn einer fragen würde: "Ich will ein Farbiges Rechteck in ein JPanel zeichnen, wie geht das?" Würdest du vermutlich auch nicht sagen: "Leg' eine JComponent mit der passenden Background-Farbe auf das Panel". Wenn er aber (indirekt) fragt: "Ich will VIELE farbige Rechtecke auf ein JPanel zeichnen", dann ist der JTable-Vorschlag das gleiche - nur noch etwas "schlimmer"....


----------



## Wildcard (18. Feb 2007)

Der Grund warum ich zu Standard Komponenten rate, ist das Anfängern das zeichnen in Swing anscheinend große Probleme bereitet.
Das fängt mit Problemen mit dem Layout Manager an (da selbst gezeichnete Komponenten eben nicht einfach so ihre Größe bestimmen), geht weiter mit getGraphics und endet irgendwann mit fehlenden super Aufrufen.
JTable hat den Vorteil das weniger erfahrene Programmierer IMO mit Standardkomponenten besser zurecht kommen.
Wenn du die Sache weiterdenkst ist es bei einem eigenen Grid nur sinnvoll auch die Schrift selbst zu zeichnen (oder aber wieder einen Renderer einzuführen) und plötzlich stehst du vor dem Problem der Ausrichtung. Font Metrics, Berechnungen,...
Das alles erledigt die JTable für dich und ist daher für einen schnellen Erfolg meiner Meinung nach Mittel der Wahl.


----------



## Marco13 (19. Feb 2007)

Oha sorry   hattes das so verstanden, dass wirklich NUR die farbigen Zellen (und nicht die eigentlichen Werte) gezeichnet werden sollen. Wenn man die Zahlen dort auch noch ausgeben soll, hast du recht - dann "lohnt" sich eine JTable schon langsam...


----------



## jino (20. Feb 2007)

Wildcard hat gesagt.:
			
		

> @Marco13:
> Meiner Meinung nach lohnt sich die Arbeit einach nicht, da es in diesem Fall extrem einfach ist einen Renderer zu schreiben, da die Farbe (soweit ich verstanden habe) direkt von dem double Wert in der Zelle abhängt.




Danke Marco und wildcard für die Hilfe! 
ich habe mich auch für JTable entschieden, aber leider habe ich auch da ein Problem:

Ich will setValue(Obj) von DefaultTableCellRenderer verwenden, aber ich weiss es nicht, woran liegt, dass die setValue() nicht aufgerufen wird, 
ich gehe davon aus, dass die methode setDefaultRenderer(String.class,ren) sich drum kümmert.stimmt das?



so sieht mein Code aus:

```
public PaneOfMatrix{

public static JScrollPane getMatrixInPane(double [][] matrix){
	JTable table = MatrixTable.createTable(matrix);
	JScrollPane pane  = new JScrollPane(table);
return pane; 

}


public static JTable createTable(double [][] matrix){
	
	final double [][] data = matrix;
    	final int i = data[0].length - 1;;
	final int j = data.length - 1;;
	final String text ="";
	TableModel model = new AbstractTableModel() {
	    public int getRowCount() { return i; }
	    public int getColumnCount () { return j; }
            public Object getValueAt(int row, int col) {
            	return String.valueOf(data[row][col]).substring(0,1);// String 
            }
        };
        JTable table = new JTable(model);
	ColoredTableCellRenderer ren = new ColoredTableCellRenderer();
        table.setDefaultRenderer( String.class, ren );
	table.getTableHeader().setVisible(false);
    	
	return table;
}


private static  class ColoredTableCellRenderer extends DefaultTableCellRenderer{
		
	public void setValue( Object value ){

	    if ( value instanceof String )
	    {
	    	System.out.println(" setValue(Obj ) " + value);
	    	if(value instanceof String){
	    		double dvalue = Double.parseDouble((String)value);
	    		if(dvalue<4)
	    			setForeground(Color.RED);
	    	}
    		setText((String) value);
	    }
	    else
	      super.setValue( value );
	}
}

}
```

(vielleicht mache ich doch was falsches?? mein Ziel ist die Farbe für Zelle festzulegen)

Für jede hilfe bin ich sehr dankbar!

Gruss
alex


----------



## Marco13 (20. Feb 2007)

Eine Websuche liefert hier erstaunlicherweise ziemlich genau das, was du suchst...

http://www.javaworld.com/javaworld/javaqa/2001-09/03-qa-0928-jtable.html

Wenns damit nicht klappt, sag nochmal bescheid


----------



## Guest (21. Feb 2007)

Super! Jetzt funktioniert's , das Beispiel von javaworld war hilfsreich.
Danke schön marco

Gruss
Alex




			
				Marco13 hat gesagt.:
			
		

> Eine Websuche liefert hier erstaunlicherweise ziemlich genau das, was du suchst...
> 
> http://www.javaworld.com/javaworld/javaqa/2001-09/03-qa-0928-jtable.html
> 
> Wenns damit nicht klappt, sag nochmal bescheid


----------

