Prüfung ob JCeckBoxen angehakt sind schlägt fehl ?

Status
Nicht offen für weitere Antworten.
S

SiR

Gast
Hallo,


die anzahl der Zeilen einer tabelle wird durchlaufen. Dabei wird jedesmal geprüft ob der WErt einer JCheckBox false/true ist. Dabei wird die jeweilige Zeile die false ist in ein Vector geaddet. Am schluss wird geprüft, ob überhaupt Checkboxen vergessen wurden abzuhaken , wenn ja werden alle Zeilen mit checkbox = false ausgegeben. Die Krux ist, dass der compiler bei mir nie in den Bereich "vergessen3" kommt ??? Obwohl beim Test alle 30 JCheckboxen keinen haken haben ??? Und ich hätte schwören könnte, das ganze ging vorher bis ich die sache mit dem Vector zeile hinzufügte, nur finde ich den fehler net ...

Code:
public void testStatus()
    {
    	System.out.print("vergessen1"); 
    	 boolean checkFailed = false;
    	 int length = dm.getRowCount();
    	 Vector zeile = new Vector();
    	 String test ="";
    	 for(int i=0 ; i < length; i++)
            { 
                        System.out.print("vergessen2");       	
     		Boolean statusCB = (Boolean)dm.getValueAt(i,0);
    		 
    		if(Boolean.FALSE.equals(statusCB))
    		{  
                                    System.out.print("vergessen3"); 			
    			checkFailed = true;
    			zeile.addElement(i+" ,"); 
    		}     		
         } 
    	 
    	 for(int a = 0 ; a < zeile.size() ; a++)
    	 {
    		 test = test + zeile.get(a); 
    	 }	 
    	 
    	 if(checkFailed) JOptionPane.showMessageDialog(this,"Die Zeile(n) " + test + " wurden nicht erledigt!");    	 
    }

Sieht jemand einen Fehler oder so?
 
S

SiR

Gast
Das ist ja witzig... wenn ich Zeile 7 + 8 anhake und Zeile 10 + 11 auch, dann wird Zeile 9 als falsch gemeldet aber sonst nix??? HÖ?

Jetzt kommt die knaller Frage: muss ich da einen celleditor implementieren für so ne abfrage? habe ja bisher nur boolean.class für die checkboxen...
 
S

SiR

Gast
noch witziger, wenn ich einmal die checkboxen gehakt habe und wieder enthakt, dann bekomme ich richtig gemeldet, dass diese checkboxen nicht gehakt sind aha wo ist denn da der haken? :p
 

*Hendrik

Bekanntes Mitglied
Das sollte eigentlich ohne Celleditor gehen. Du verwendest doch ein TableModel? Ich würde zunächst erst mal bei
Code:
Boolean statusCB = (Boolean)dm.getValueAt(i,0);
statusCB außerhalb der for-Schleife definieren und in der Schleife nur noch neue Werte zuweisen. Zudem würde ich eher println() statt print() zur Ausgabe verwenden. Vielleicht kannst Du auch mehr Code posten, damit man es bessser nachvollziehen u. testen kann.
 

*Hendrik

Bekanntes Mitglied
Und bei
Code:
        for(int a = 0 ; a < zeile.size() ; a++) 
        { 
           test = test + zeile.get(a); 
        }

würde ich statt String einen StringBuffer verwenden und mit append arbeiten.
 
S

SiR

Gast
*Hendrik hat gesagt.:
Das sollte eigentlich ohne Celleditor gehen. Du verwendest doch ein TableModel? Ich würde zunächst erst mal bei
Code:
Boolean statusCB = (Boolean)dm.getValueAt(i,0);
statusCB außerhalb der for-Schleife definieren und in der Schleife nur noch neue Werte zuweisen. Zudem würde ich eher println() statt print() zur Ausgabe verwenden. Vielleicht kannst Du auch mehr Code posten, damit man es bessser nachvollziehen u. testen kann.

Code:
model = new DefaultTableModel(tabellendaten,spaltennamen){
        	   //@Override
        	   public boolean isCellEditable(int row, int column){
        	      /*if (column == 0)return false; //oder andere Bedingungen...
        	      else return true;*/
        		   return true;
        	   }
        	};
        mytable = new JTable( model ){
        	
			private static final long serialVersionUID = 1L; 
					Class[] types = new Class [] {        			
                    Boolean.class, String.class, String.class, String.class
                };
            @SuppressWarnings("unchecked")
			public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

passt das so?
 

*Hendrik

Bekanntes Mitglied
Wenn ich es auch etwas anders programmieren würde - eher nach dem Beispiel - so funktioniert Dein Code so wie er ist bei mir. Vielleicht hängt es mit den Daten zusammen, die Du in die Tabelle schreibst. Wie füllst Du die Tabelle?
 
S

SiR

Gast
*Hendrik hat gesagt.:
Wenn ich es auch etwas anders programmieren würde - eher nach dem Beispiel - so funktioniert Dein Code so wie er ist bei mir. Vielleicht hängt es mit den Daten zusammen, die Du in die Tabelle schreibst. Wie füllst Du die Tabelle?

Die TAbelle hm eigentlich gehts ja um die Checkboxen ist da der Tabelleninhalt wichtig? Aber ok der user gibt einfach daten ein in einer anderen spalte, hat ja noch 3 textspalten wie du gesehen hast. 3 x String.class.
 

*Hendrik

Bekanntes Mitglied
Hier mal mein Testcode aus NetBeans:

Code:
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class NeuJFrame3 extends javax.swing.JFrame implements java.awt.event.ActionListener {
    DefaultTableModel model;

    public NeuJFrame3() {
        
    Object [][] tabellendaten = new Object[31][4];
    String[] spaltennamen = {"Boolean","Spalte 1","Spalte 2", "Spalte 3"};
    
    for(int i = 0;i<31;i++){
        
        tabellendaten [i][0]= true;
        tabellendaten [i][1]= "Spalte 1";
        tabellendaten [i][2]= "Spalte 2";
        tabellendaten [i][3]= "Spalte 3";
    }
    
    model = new DefaultTableModel(tabellendaten,spaltennamen){
        //@Override
        public boolean isCellEditable(int row, int column){
                 /*if (column == 0)return false; //oder andere Bedingungen...
                 else return true;*/
            return true;
        }
    };
    
    initComponents();
    
    }
                   
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new JTable(model){

            private static final long serialVersionUID = 1L;
            Class[] types = new Class [] {Boolean.class, String.class, String.class, String.class};
            @SuppressWarnings("unchecked")
            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        };
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jScrollPane1.setViewportView(jTable1);

        jButton1.setText("Status testen");
        jButton1.addActionListener(this);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE)
                    .addComponent(jButton1))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 517, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton1)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        pack();
    }


    public void actionPerformed(java.awt.event.ActionEvent evt) {
        if (evt.getSource() == jButton1) {
            NeuJFrame3.this.jButton1ActionPerformed(evt);
        }
    }              

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        testStatus();
    }                                        
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NeuJFrame3().setVisible(true);
            }
        });
    }
                       
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;                 

    public void testStatus() {
        
        System.out.println("vergessen1");
        boolean checkFailed = false;
        int length = jTable1.getRowCount();
        Vector zeile = new Vector();
        String test ="";
        for(int i=0 ; i < length; i++) {
            System.out.println("vergessen2");
            Boolean statusCB = (Boolean)jTable1.getValueAt(i,0);
            
            if(Boolean.FALSE.equals(statusCB)) {
                System.out.println("vergessen3");
                checkFailed = true;
                zeile.addElement(i+" ,");
            }
        }
        
        for(int a = 0 ; a < zeile.size() ; a++) {
            test = test + zeile.get(a);
        }
        
        if(checkFailed) JOptionPane.showMessageDialog(this,"Die Zeile(n) " + test + " wurden nicht erledigt!");
    }
    
}

Und hier muss es ja irgendeinen Unterschied zu Deinem Code geben, weshalb es nicht funktioniert.
 
S

SiR

Gast
*Hendrik hat gesagt.:
Hier mal mein Testcode aus NetBeans:

Und hier muss es ja irgendeinen Unterschied zu Deinem Code geben, weshalb es nicht funktioniert.

hast du an meinem code etwas geändert oder meinen übernommen wie er ist. Vllt. liegts an deinem code. Ich vergleich mal morgen.
 
S

SiR

Gast
Ok bei deinem code sind alle JCheckBoxen auf true von anfang an, daher kommt da keine Meldung und die Ausgabe mit System.out usw des Boolean wertes der statusCB ist auch true nicht null.

Bei mir ist dies erst nachdem ich 1 checkbox angehakt und wieder enthakt habe. Sprich warum ist in deiner TAbelle jede checkbox angehakt von Anfang an? Ich sehe da keine Einstellung dazu? Du hast nur Boolean.class sonst nix??
 

*Hendrik

Bekanntes Mitglied
SiR hat gesagt.:
Bei mir ist dies erst nachdem ich 1 checkbox angehakt und wieder enthakt habe. Sprich warum ist in deiner TAbelle jede checkbox angehakt von Anfang an? Ich sehe da keine Einstellung dazu? Du hast nur Boolean.class sonst nix??

Da ich Testdaten benötige, fülle ich die Tabelle im Konstruktor:
Code:
    for(int i = 0;i<31;i++){ 
        
        tabellendaten [i][0]= true; 
        tabellendaten [i][1]= "Spalte 1"; 
        tabellendaten [i][2]= "Spalte 2"; 
        tabellendaten [i][3]= "Spalte 3"; 
    }

Es funktioniert aber auch alles, wenn ich
Code:
tabellendaten [i][0]= false;
setze.
 
S

SiR

Gast
Es funktioniert aber auch alles, wenn ich
Code:
tabellendaten [i][0]= false;
setze.

richtig darum gehts am Anfang steht immer null da die checkbox net initialisiert... Also explizit auf false setzen, ich probiers gerade.
 
S

SiR

Gast
*Hendrik hat gesagt.:
SiR hat gesagt.:
Bei mir ist dies erst nachdem ich 1 checkbox angehakt und wieder enthakt habe. Sprich warum ist in deiner TAbelle jede checkbox angehakt von Anfang an? Ich sehe da keine Einstellung dazu? Du hast nur Boolean.class sonst nix??

Da ich Testdaten benötige, fülle ich die Tabelle im Konstruktor:
Code:
    for(int i = 0;i<31;i++){ 
        
        tabellendaten [i][0]= true; 
        tabellendaten [i][1]= "Spalte 1"; 
        tabellendaten [i][2]= "Spalte 2"; 
        tabellendaten [i][3]= "Spalte 3"; 
    }

Es funktioniert aber auch alles, wenn ich
Code:
tabellendaten [i][0]= false;
setze.

ja verreck nochmal, wieso kannst du true zuweisen und bei mir sagt er cannot convert from boolean to string?
 

*Hendrik

Bekanntes Mitglied
Da bei mir die Daten ein Object-Array sind:

Code:
Object [][] tabellendaten = new Object[31][4];

Und bei Dir anscheinend ein String? Deswegen war schon vorher meine Vermutung, dass es evtl. mit Deinen Daten zusammenhängt.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben