# Kreuztabelle mit Selektion



## echnaton12 (14. Nov 2005)

Hallo alle zusammen,

habe da ein kleines Problem vielleicht wisst Ihr weiter.
Ich bräuschte eine Kreustabellen was nicht sonderlich schwierig ist nehme ich an mit JTable. Jedoch sollte man mit der Maus mehrere Felder (nebeneinander liegend) selektieren können (Makieren können) und die Farbe verstellen bei den selektierten Feldern. Also wie in einem Excel File. kann mir jemand sagen was ich dafür am besten nehmen könnte oder geht das mit JTable? Bei JTable kann man glaube ich nur die ganze Reihe oder die Zeile selektieren

Danke schonmal im voraus.


----------



## André Uhres (14. Nov 2005)

```
package table;
/*
* Kreuz_Tabelle.java
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.border.*;
public class Kreuz_Tabelle extends JFrame implements ListSelectionListener{
    private final String WERTLOS = "-----";
    private JTable table;
    private JToolBar toolbar;
    private JButton redBtn, whiteBtn;
    private HashMap<String, String> colorMap = new HashMap<String, String>();
    private final Color redSelected = new Color(255,150,150);
    public Kreuz_Tabelle() {
        super("Kreuztabelle");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        table = new JTable() {
            public Component prepareRenderer(
                    final TableCellRenderer renderer, final int row, final int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                String key = row+":"+column;
                c.setBackground(Color.white );
                boolean selected = isRowSelected(row) && isColumnSelected(column);
                if( selected ){
                    if( table.getValueAt(row,column).toString().equals(WERTLOS)){
                        c.setBackground(table.getBackground());
                        ((JComponent)c).setBorder(new LineBorder(table.getBackground()));
                    }else{
                        c.setBackground(Color.cyan);
                    }
                }
                String colorValue = colorMap.get(key);
                if( colorValue!=null ){
                    if( (colorValue).equals("red") ){
                        c.setBackground(Color.red);
                        if( selected ){
                            c.setBackground(redSelected);
                        }
                    }
                    if( (colorValue).equals("white") ) {
                        c.setBackground(Color.white);
                        if( selected ){
                            c.setBackground(Color.cyan);
                        }
                    }
                }
                return c;
            }
        };
        table.setModel(new DefaultTableModel(
                new Object [][] {
                    {"Jan", "50", "55", "50"},
                    {"Feb", "-----", "50", "50"},
                    {"Mär", "55", "-----", "-----"},
                    {"Apr", "40", "50", "55"},
                    {"Mai", "35", "40", "35"},
                    {"Jun", "40", "45", "45"},
                    {"Jul", "50", "50", "55"},
                    {"Aug", "-----", "55", "-----"},
                    {"Sep", "-----", "-----", "55"},
                    {"Okt", "50", "55", "45"},
                    {"Nov", "70", "65", "75"},
                    {"Dez", "75", "70", "65"}
        },
                new String [] {
            "Jahr:", "2001", "2002", "2003"
        }
        ) {
            Class[] types = new Class [] {
                String.class, String.class, String.class, String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false
            };
            public Class getColumnClass(final int columnIndex) {
                return types [columnIndex];
            }
            public boolean isCellEditable(final int rowIndex, final int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        table.setCellSelectionEnabled(true);
        table.getColumnModel().getSelectionModel().addListSelectionListener(this);
        //table.setTableHeader(null);
        table.getTableHeader().setReorderingAllowed(false);
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
       
        toolbar = new JToolBar();
        redBtn = new JButton();
        toolbar.setFloatable(false);
        redBtn.setBackground(Color.red);
        redBtn.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                colorButtonActionPerformed("red");
            }
        });
        toolbar.add(redBtn);
        whiteBtn = new JButton();
        toolbar.setFloatable(false);
        whiteBtn.setBackground(Color.white);
        whiteBtn.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                colorButtonActionPerformed("white");
            }
        });
        toolbar.add(whiteBtn);
        getContentPane().add(toolbar, BorderLayout.NORTH);
    }
    public void valueChanged(final ListSelectionEvent e) {
        ListSelectionModel source = (ListSelectionModel)e.getSource();
        if(source.getMinSelectionIndex() == 0)
            source.setSelectionInterval(1, source.getMaxSelectionIndex());
    }
    private void colorButtonActionPerformed(final String color) {
        int[] row = table.getSelectedRows();
        int[] column = table.getSelectedColumns();
        for (int i = 0; i < row.length; i++) {
            for (int j = 0; j < column.length; j++) {
                String key = row[i]+":"+column[j];
                String value = table.getValueAt(row[i],column[j]).toString();
                if(!value.equals(WERTLOS))
                    colorMap.put(key, color);
            }
        }
        table.updateUI();
    }
    public static void main(final String args[]) { new Kreuz_Tabelle().setVisible(true); }
}
```


----------



## echnaton12 (14. Nov 2005)

Super das ist echt toll kann man das auch noch so machen das der selectierte Bereich einen Anderen Hintergrund bekommt und wenn ich neu selecttiere der dann erneut die Hintergrundfarbe geändert wird?


----------



## André Uhres (14. Nov 2005)

Im Programm "Kreuz_Tabelle.java" hab ich jetzt die Methode "prepareRenderer" von JTable überschrieben
und zwei Buttons angelegt um die Farben ändern zu können (rot und weiss).
Die Farbe, die für eine selektierte Zelle gewählt wurde, wird in der "colorMap" gespeichert.


----------



## echnaton12 (15. Nov 2005)

Danke dir das ist echt nett. Du kennst dich recht gut aus mit den JTable bei mir sind sie die schwachstelle. Also danke nochmal.


----------



## echnaton12 (15. Nov 2005)

Hi noch eine kurze Frage wir bewerkstellige ich das die erste Spalte nicht selektierbar ist?


----------



## André Uhres (15. Nov 2005)

Ich habe jetzt einen ListSelectionListener eingebaut.
Die Methode "valueChanged(ListSelectionEvent e)" passt die Selektion so an,
daß die erste Spalte nie selektiert wird.

```
import javax.swing.event.*; 
...
public class Kreuz_Tabelle extends JFrame implements ListSelectionListener{ 
...
        table.getColumnModel().getSelectionModel().addListSelectionListener(this);
...
    public void valueChanged(ListSelectionEvent e) { 
        ListSelectionModel source = (ListSelectionModel)e.getSource(); 
        if(source.getMinSelectionIndex() == 0) 
            source.setSelectionInterval(1, source.getMaxSelectionIndex()); 
    }
```


----------



## echnaton12 (15. Nov 2005)

Danke echt super von dir


----------



## echnaton12 (15. Nov 2005)

Du mal ne dumme Frage noch neben bei wie kann ich den Kopfzeile unsichtbar machen? mit setVisible werden nur die Zeilen unterhalb der Kopfzeile invisible gesetzt.


----------



## Sky (15. Nov 2005)

Ohne den ganzen Thread gelesen zu haben; falls es um eine JTable geht:

```
myTable.getTableHeader().setVisible(false);
```


----------



## André Uhres (15. Nov 2005)

Für den Fall wo die Tabelle nicht "scrollable" zu sein braucht, kannst du das JScrollPane einfach weglassen,
dann wird auch keine Kopfzeile gezeigt:

```
getContentPane().add(table, BorderLayout.CENTER);
```


----------



## André Uhres (15. Nov 2005)

...oder so:
	
	
	
	





```
table.setTableHeader(null);
```


----------



## echnaton12 (16. Nov 2005)

Andre_Uhres hat gesagt.:
			
		

> ...oder so:
> 
> 
> 
> ...


Du mal noch eine Frage ich habe bei der Methode "add" das "BorderLayout.center" immer vor der Componente stehen ist das egal oder schmeißt java einfach keine Exception und ignoriert dann das BorderLayout.


----------



## André Uhres (16. Nov 2005)

```
public  Component add(String name, Component comp)
```
Diese Methode fügt die angegebene Komponente zu diesem Container hinzu. 
Dies ist eine Annehmlichkeitsmethode für: "protected  void addImpl(Component comp, Object constraints, int index)".
Sie ist seit 1.1 überholt. Bitte benutze statt dessen die Methode: 
	
	
	
	





```
add(Component comp, Object constraints)
```


----------



## echnaton12 (16. Nov 2005)

Andre_Uhres hat gesagt.:
			
		

> ```
> public  Component add(String name, Component comp)
> ```
> Diese Methode fügt die angegebene Komponente zu diesem Container hinzu.
> ...



aber funktionieren tut sie mal noch eine frage zu den tables wie schalte ich die spaltenvertauscherei ab


----------



## André Uhres (16. Nov 2005)

```
table.getTableHeader().setReorderingAllowed(false);
```


----------



## echnaton12 (28. Nov 2005)

Du mal noch ne Frage wie lege ich die minimale Breite der ersten Spalte fest, so das der Text voll lesbar ist?


----------



## André Uhres (28. Nov 2005)

Beispiel Ändere von der ersten Spalte die Breite auf 100 Pixel.


```
TableColumn col = table.getColumnModel().getColumn( 0 );
col.setPreferredWidth( 100 );
```


----------



## echnaton12 (28. Nov 2005)

Hi noch eine frage du hattest mir ja den Tip gegeben mit dem cellRenderer um die Farben der einzelnen Zellen zu verändern jetzt würde ich diese Farbe gern abfragen und habe es mit

```
Component comp = (Component)this.tableLogger.getCellRenderer(row,col);
```
probiert aber irgendwie klappt das nicht ganz hast du da eine Idee wie ich da ran komme?


----------



## André Uhres (28. Nov 2005)

```
private String getCellColor(final int row, final int column){
        String color = (String)colorMap.get(row+":"+column);
        if(color==null) color="white";
        return color;
    }
```


----------



## André Uhres (29. Dez 2005)

@echnaton12: aufgrund deiner PN habe ich den Code von "Kreuz_Tabelle.java"  angepasst (zweiter Post auf Seite 1).
Zellen mit dem Wert "-----" werden jetzt nicht mehr selektiert.


----------

