Kreuztabelle mit Selektion

Status
Nicht offen für weitere Antworten.

echnaton12

Mitglied
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.
 
Code:
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); }
}
 
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?
 
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.
 
Danke dir das ist echt nett. Du kennst dich recht gut aus mit den JTable bei mir sind sie die schwachstelle. Also danke nochmal.
 
Ich habe jetzt einen ListSelectionListener eingebaut.
Die Methode "valueChanged(ListSelectionEvent e)" passt die Selektion so an,
daß die erste Spalte nie selektiert wird.
Code:
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()); 
    }
 
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.
 
Ohne den ganzen Thread gelesen zu haben; falls es um eine JTable geht:
Code:
    myTable.getTableHeader().setVisible(false);
 
Für den Fall wo die Tabelle nicht "scrollable" zu sein braucht, kannst du das JScrollPane einfach weglassen,
dann wird auch keine Kopfzeile gezeigt:
Code:
getContentPane().add(table, BorderLayout.CENTER);
 
Andre_Uhres hat gesagt.:
...oder so:
Code:
getContentPane().add(table, BorderLayout.CENTER);
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.
 
Code:
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:
Code:
add(Component comp, Object constraints)
 
Andre_Uhres hat gesagt.:
Code:
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:
Code:
add(Component comp, Object constraints)

aber funktionieren tut sie mal noch eine frage zu den tables wie schalte ich die spaltenvertauscherei ab
 
Beispiel Ändere von der ersten Spalte die Breite auf 100 Pixel.

Code:
TableColumn col = table.getColumnModel().getColumn( 0 );
col.setPreferredWidth( 100 );
 
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
Code:
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?
 
Code:
   private String getCellColor(final int row, final int column){
        String color = (String)colorMap.get(row+":"+column);
        if(color==null) color="white";
        return color;
    }
 
@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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben