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.
 

André Uhres

Top Contributor
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); }
}
 

echnaton12

Mitglied
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

Top Contributor
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

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

André Uhres

Top Contributor
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()); 
    }
 

echnaton12

Mitglied
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

Top Contributor
Ohne den ganzen Thread gelesen zu haben; falls es um eine JTable geht:
Code:
    myTable.getTableHeader().setVisible(false);
 

André Uhres

Top Contributor
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);
 

echnaton12

Mitglied
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.
 

André Uhres

Top Contributor
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)
 

echnaton12

Mitglied
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
 

André Uhres

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

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

echnaton12

Mitglied
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?
 

André Uhres

Top Contributor
Code:
   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

Top Contributor
@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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H CheckBoxListCell Selektion ermitteln AWT, Swing, JavaFX & SWT 2
F Zeile in mehreren Jtables bei Selektion markieren AWT, Swing, JavaFX & SWT 11
T Zelle- und die Zeile-Farbenwechsel bei der Selektion in der Tabelle AWT, Swing, JavaFX & SWT 4
MiMa Selektion aus einer ListView AWT, Swing, JavaFX & SWT 5
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
K JTabbedPane Tab Markierung / Selektion AWT, Swing, JavaFX & SWT 4
S Selektion bei Drag&Drop AWT, Swing, JavaFX & SWT 4
M Probleme mit der Selektion einer JTextArea AWT, Swing, JavaFX & SWT 3
B JTable Selektion von Zellen AWT, Swing, JavaFX & SWT 3
S Swing Jlist - CellRenderer/ Selektion AWT, Swing, JavaFX & SWT 2
F Swing JTable Einfach-Selektion überschreiben AWT, Swing, JavaFX & SWT 4
M Swing Selektion mehrerer JToggleButton's in einer Gruppe AWT, Swing, JavaFX & SWT 5
L JTree Selektion "füllen" AWT, Swing, JavaFX & SWT 4
hdi Swing JTable: Selektion beim Umsortieren anpassen AWT, Swing, JavaFX & SWT 7
hdi Swing JTable - Selektion aufheben AWT, Swing, JavaFX & SWT 3
M Swing JList --> Selektion für bestimmte Indexe verbieten? AWT, Swing, JavaFX & SWT 8
P Selektion in JXTreeTable von SwingX AWT, Swing, JavaFX & SWT 5
R JTabbedPane Selektion verfolgen? AWT, Swing, JavaFX & SWT 2
M JList.clearSelection() hebt Selektion nicht auf AWT, Swing, JavaFX & SWT 6
T JTree macht mich wahnsinnig (selektion) AWT, Swing, JavaFX & SWT 2
C Selektion einer JList aufheben AWT, Swing, JavaFX & SWT 3
technolion FileDialog/keine Multi-Selektion vs. JFileCHooser/kein LaF AWT, Swing, JavaFX & SWT 2
W JTree je nach selektion JPane ein und ausblenden AWT, Swing, JavaFX & SWT 7
sparrow JComboBox soll Selektion anhand der Eingabe ändern AWT, Swing, JavaFX & SWT 2
R JTree: TreeCellRenderer und Selektion eines Knoten AWT, Swing, JavaFX & SWT 10
F JTable: Selektion einer kompletten Zeile AWT, Swing, JavaFX & SWT 5
G JTable selektion der Zeile bei Fokusieren mit der Maus AWT, Swing, JavaFX & SWT 5
G JTable - PopUpMenu nur bei Selektion anzeigen. AWT, Swing, JavaFX & SWT 8
C JTable update: Selektion beibehalten AWT, Swing, JavaFX & SWT 12
L JTextField: Kompletten Text bei Selektion markieren AWT, Swing, JavaFX & SWT 5
F Selektion im JTree AWT, Swing, JavaFX & SWT 2
D Visualisierung einer Selektion in einer Grafik. AWT, Swing, JavaFX & SWT 7
D JTable - Auto-Selektion NACH Zelleditierung steuern AWT, Swing, JavaFX & SWT 2
M JTree und Selektion AWT, Swing, JavaFX & SWT 2
N Selektion von Text bei JTextArea - - Aktualisierungsproblem? AWT, Swing, JavaFX & SWT 2
M JTree: Selektion der Elemente nicht mehr sichtbar AWT, Swing, JavaFX & SWT 6
K MenuItem: Farbe bei Selektion AWT, Swing, JavaFX & SWT 4
K property panel und selektion einer componente in panel AWT, Swing, JavaFX & SWT 5
E JTable: Selektion nur mit einem Doppelklick? AWT, Swing, JavaFX & SWT 7
X JTree: Selektion nach dem Entfernen von Knoten AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben