Verschiedene ComboBoxen in JTable

  • Themenstarter Themenstarter kriizz
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
K

kriizz

Gast
Hallo,

ich habe nun seit ca. 3 Monanten in der Schule JAVA, also bin ich ein kompletter Neuling 😉

Ich hänge zur Zeit an einem Problem...
Ich habe eine Tabelle, in der in der ersten Spalte "Aufgaben" stehen und in der Zweiten die Mitarbeiter aus einer Checkbox ausgewählt werden.

Die Chekcboxen auszulesen ist kein Problem. Nur muss ich wissen, welche Checkbox geändert wurde. Also welche Aufgabe quasi zur CheckBox gehört. Kann mir da jemand helfen???

Code:
package tasks;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;

import javax.swing.JTable;
import javax.swing.DefaultCellEditor;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;

import moduls.MysqlConnect;


public class taskGiveGui extends JPanel {
    
    
    /**
     * Liest aus DB aus, erstellt Array mit Länger der Einträge und füllt das Array mit den Namen.
     * @return Inhalt für ComboBox
     */
    public static String[] selectComboBox() {
        // arraylaenge auswählen
         int i = 0; 
        try {
           
           java.sql.Connection conn = MysqlConnect.connect();  // Verbindung zur DB
           Statement stmt = conn.createStatement();
           ResultSet rs = null;                      
           rs = stmt.executeQuery("SELECT firstname,surname FROM login");                      
           
           while ( rs.next() ){
             i++;             
           }           
        throw new Exception();
        } catch(Exception e) {
            System.out.println("da stimmt was nicht");
        }
        
       int n = i;
       String[] titles = new String[n];
        try {
           
           java.sql.Connection conn = MysqlConnect.connect();  // Verbindung zur DB
           Statement stmt = conn.createStatement();
           ResultSet rs = null;
           
                      
           rs = stmt.executeQuery("SELECT firstname,surname FROM login");
           titles[0] ="Bitte wählen";
           int j = 1;
           
           
           while ( rs.next() ){
             titles[j] = rs.getString(2)+","+ rs.getString(1);
             j++;
             
           }       
        
        throw new Exception();
        } catch(Exception e) {
            System.out.println("da stimmt was nicht");
        }
        return titles;
    }
    
   /** Aufgaben aus DB lesen **/ 
   public static Object[][] selectTasks() {
       int i = 0; 
        try {
           
           java.sql.Connection conn = MysqlConnect.connect();  // Verbindung zur DB
           Statement stmt = conn.createStatement();
           ResultSet rs = null;                      
           rs = stmt.executeQuery("SELECT task FROM tasks");                      
           
           while ( rs.next() ){
             i++;             
           }           
        throw new Exception();
        } catch(Exception e) {
            System.out.println("da stimmt was nicht");
        }
       int n = i;
       Object[][] tasks = new Object[n][2];
       
       try {
           
           java.sql.Connection conn = MysqlConnect.connect();  // Verbindung zur DB
           Statement stmt = conn.createStatement();
           ResultSet rs = null;
           
                      
           rs = stmt.executeQuery("SELECT task FROM tasks");
           
           int j = 0;
           
           
           while ( rs.next() ){
             tasks[j][0] = rs.getString(1);
             tasks[j][1] = "Bitte wählen";
             j++;             
           }       
        
        throw new Exception();
        } catch(Exception e) {
            System.out.println("da stimmt was nicht");
        }
        return tasks; 
        
    }
    
    /**
     * Tabelle zusammenbauen
     */
     static class TableModel extends AbstractTableModel {
        Object[] titles = {"Aufgabe", "Mitarbeiter"}; 
        
        Object[][] contents = selectTasks();
            
        
        /** Liefert den Namen der geforderten Spalte.
         * @return Name der Spalte.
         */
     
        public String getColumnName(int col) {
            return titles[col].toString();
        }

        /* Liefert die Anzahl der Zeilen zurück.
         * @return die Anzahl der Zeilen.
         */
        public int getRowCount() { return contents.length; }
        
        /* Liefert die Anzahl der Spalten zurück.
         * @return die Anzahl der Spalten.
         */
        public int getColumnCount() { return titles.length; }
        
        /** Liefert den Wert in der geforderten Zeile/Spalte.
         * @return Wert in der geforderten Zeile/Spalte.
         */
        public Object getValueAt(int row, int col) {
            return contents[row][col];
        }
         
        
        public void setValueAt(Object value, int row, int col) {
            contents[row][col] = value;
            fireTableCellUpdated(row, col); // Listener informieren, dass sich etwas geändert hat
        }

        /** Gibt an, ob der Wert in der geforderten Zeile/Spalte editierbar sein soll.
         * @return wahr wenn editierbar, falsch wenn nicht.
         */
        public boolean isCellEditable(int row, int col) {
            if (col == 1) {
                return true;
            } else {
                return false;
            }
        }
     
        /** Gibt an, was für ein Datentyp in der geforderten Spalte steht.
         * @return Datentyp der Spalte (Wrapper Klasse für primitive Datentypen).
         */
        public Class getColumnClass(int col) {
            if ( col <= 1 ) {
                return String.class;
            } else {
                return Boolean.class;
                       
        }
    }
     
   
     }
    /**
     * Tabelle in ScrollPane setzen
     * @return ScrollPane für den MainFrame
     */
    
    public static JComponent createTable() {
        
        Object[] items = selectComboBox();
        JComboBox comboBox = new JComboBox(items); // ComboBox mit Inhalt initialisieren
        comboBox.addItemListener(new ItemListener() {
             public void itemStateChanged(ItemEvent e) {
                System.out.println(e.getSource());
       }});

        JTable table = new JTable(new TableModel()); // Tabelle erzeugen
        TableColumn colModel = table.getColumnModel().getColumn(1); // Spaltenmodell holen        
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        JTableHeader header = table.getTableHeader();
       
        header.setBackground(new Color( 255, 180, 0));
        colModel.setCellEditor(new DefaultCellEditor(comboBox)); // comboB
        table.setShowVerticalLines(false);
        table.setBackground(Color.WHITE);
        header.setAlignmentY(LEFT_ALIGNMENT);
        header.setFont(new Font("TimesRoman",Font.BOLD,14));
         
        
        JScrollPane pane = new JScrollPane(table);
        pane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        
    
        return pane;            
        
        
    }
    
}
 
schau dir die Methode :

public Object getValueAt(int row, int col){
}

mal genauer an 😉 vor allem wann sie aufgerufen wird und was sie zurück gibt, denke müsste dir schon mal nen bisschen weiter helfen!
 
Hallo,

vielleicht kann man das auch über einen PopupListener lösen, der deinen Comboboxen angehängt ist.

Deinen Comboboxen gibst du ein "setActionCommand" mit und im Popuplistener fragst du das dann so ab:

Code:
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {

           Object source = e.getSource();

           if (source instanceof JComboBox) {  

                String actionCmd = ((JComboBox) source).getActionCommand();

           }

}

Die Idee habe ich von folgendem Link:

http://www.wer-weiss-was.de/theme35/article2020402.html

Schau dir vor allem den letzten Beitrag an!
 
Hi...

@Mathias...
sowas habe ich mri auch schon gedacht, aber ich kann keinen ActionCommand für jeden einzeln übergeben.
Wie du siehst wird das im ColModel eingefügt. und somit ja immer der gleiche Command...

Ich hab bisher auch noch keine Lösung gefunden dies anders zu machen.

@Dit..

bei deiner Lösung bin ich gerade noch.. hab aber noch nicht ganz verstanden was du meinst.. vielleicht komm ich ja noch drauf

gruß
 
Kann es sein, dass du nur ein Objekt comboBox hast und immer nur deine items austauschst?

Ich glaube, dann wirst du keine andere Möglichkeit haben als mehrere Objekte zu erzeugen.
 
Ja ich habe nur dieses eine Objekt. Aber kannst du mri bitte sagen, wie ich sonst die Tabellenspalte füllen soll?
Wie kann ich dann zum beispiel die Zeile angeben? ich kann dooch immer nur eine komplette Spalte damit füllen...
 
Hallo,

ich kann mir leider deinen Code erst morgen wieder anschauen...

Aber so wie ich das sehe, hast du keine andere Wahl, als mehrere Objekte zu erzeugen.
 
Hey...

danke.. hat sich nun schon erledigt... habs hinbekommen und tut so wie ich will...
hat nun lange gedauert, aber besser spät als nie 😉

danke nochmal
 
Code:
 public Component getTableCellEditorComponent(JTable table, Object obj, boolean isSelected, int row, int col) {
      
      Boolean lValueAsBoolean = (Boolean)obj;
       theButton.setSelected(lValueAsBoolean.booleanValue());
       Object[][] ma = EmployeeSurveyGetData.selectData();
       theButton.setActionCommand((String)ma[row][0]);
      return theButton;
    }

hab hier mein Beispiel mit dem Button mal (ist genau so aufgebaut wie das mit der ComboBox).

Habe hier dem Button einen ActionCommand zugewiesen, der nachher in getCellEditorValue aufgerufen wird.
Das gleiche funktioniert so auch bei meiner ComboBox... ist vielleicht nciht die schönste art, aber es tut 😀
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben