JCheckbox entfernen

Wyatt

Erfahrenes Mitglied
Hallo Leute!

Ich arbeite zur Zeit an einem Notizblock, mit einer Tabelle stelle ich Zeit und Notizen darf und Aufgaben möchte ich mit JCheckboxen darstellen, das funktioniert soweit auch alles...

Ich besitze ein JCheckbox[] boxen array, welches 25 boxen fassen kann!
Mein Problem liegt nun daran, dass ich bisher keine Idee bzw. Möglichkeit gefunden habe, diese JCheckboxen wieder zu entfernen.
Ich habe ein JPopupMenu eingebaut mit einem "Löschen" Item, bei diesem soll nun die JCheckbox gelöscht werden...

Wenn möglich natürlich auch komplett aus dem Array entfernt werden!
Ich habe einen Beispiel-Code vorbereitet, weil mein gesamter Quellcode wäre zu lang!

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
  * @version 1.0 vom 15.06.2007
  * @author 
  **/

public class checkboxen extends JFrame {
  // Anfang Variablen
  private Container cp = getContentPane();
  private JButton hinzu = new JButton();
  private JCheckBox[] boxen = new JCheckBox[5];
  private int count=0;
  private int y=10;
  private JPopupMenu popup = new JPopupMenu();
  private JMenuItem loesch = new JMenuItem("Löschen");
  private MouseAdapter ml = null;
  // Ende Variablen

  public checkboxen(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 150;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2 ;
    setLocation(x, y);
    cp.setLayout(null);

    // Anfang Komponenten

    hinzu.setBounds(15, 200, 113, 41);
    hinzu.setText("Hinzufügen");
    cp.add(hinzu);
    hinzu.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        hinzuActionPerformed(evt);
      }
    });
    
    ml = new MouseAdapter() {
      public void mouseReleased(MouseEvent evt) {
        if (evt.isPopupTrigger()) {
          popup.show(evt.getComponent(), evt.getX(), evt.getY());
        }
      }
    };

    loesch.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        loeschActionPerformed(evt); } });
    popup.add(loesch);

    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Ereignisprozeduren
  
  public void hinzuActionPerformed(ActionEvent evt) {
    int i;
    
    if(count < 5) {
       for(i=0; i<1; i++) {
         setVisible(false);
         y = y + 25;
         
         boxen[i] = new JCheckBox();
         boxen[i].setText("Nr. "+count);
         boxen[i].setBounds(15, y, 215, 25);
         boxen[i].addMouseListener(ml);
         cp.add(boxen[i]);

         count++;
         setVisible(true);
      }
    }
  }

  public void loeschActionPerformed(ActionEvent evt) {
    /*
    *
    * HIER SOLL DIE GEPLANTE FUNKTION REIN ZUM LÖSCHEN! :)
    *
    */
  }

  // Ende Ereignisprozeduren

  public static void main(String[] args) {
    new checkboxen("checkboxen");
  }
}

Für jede Hilfe bin ich dankbar!
Unter euch gibts bestimmt einen crack, der ne gute Idee oder sogar schon eine Lösung bereit hat =)

Gruss
 
Zuletzt bearbeitet:
Hallo,

wenn du die CheckBoxen öfter hinzufügen und löschen willst ist vielleicht ein Vector besser als ein Array. Dann benutzt du addElement() und removeElement(). Um die CheckBoxen dann auch zu entfernen benutzt du getContentPane().remove().

Wenn du, wie du geschrieben hast, eine Tabelle benutzt (JTable), benutzt du das DefaultTableModel mit dem Vector. Um die CheckBox zu entfernen, löscht du sie einfach aus dem Vector und rufst setDataVector() im TableModel auf.
 
Hallo,

erstmal Dankeschön für deine Antwort!

Leider habe ich bisher mit Vectoren noch nicht gearbeitet und habe mir gerade etwas darüber durchgelesen (Guido Krüger Handbuch)...
Dadurch bin ich leider auch nicht viel schlauer geworden, Vectoren können beliebige Arten von Daten speichern, so wie ich das sehe.
Den Vector kann ich auch nicht in die ContentPane einbauen...

Kannst du mir bitte die Idee mit dem Vector in den Quellcode einbauen, das wäre nett :)

Gruss
 
Hallo,

am Besten schaust du dir die API über Vectoren an:
http://java.sun.com/javase/6/docs/api/java/util/Vector.html

dein Quellcode sieht damit dann zum Beispiel so aus:
Code:
Vector<JCheckBox> v = new Vector<JCheckBox>(0);
public void hinzuActionPerformed(ActionEvent evt) {
    if(count < 5) {
       for(int i=0; i<1; i++) {
         y = y + 25;
         
         JCheckBox cb = new JCheckBox("Nr. "+count);
         cb.setBounds(15, y, 215, 25);
         cb.addMouseListener(ml);
         v.addElement(cb);
         getContentPane().add(cb);

         count++;
      }
   }
}
public void loeschActionPerformed(ActionEvent evt) {
    Component c = getContentPane().findComponentAt(popup.getLocation());
    if(c instanceof JCheckBox) {
       getContentPane().remove(cb);
       v.removeElement(cb);
    }
}

oder mit der Tabelle:
Code:
// die titel der spalten in der tabelle
String title[] = new String[]{"Spalte1","Spalte2"};
Vector<Vector> v = new Vector<Vector>(0);
JTable table = new JTable();
public void hinzuActionPerformed(ActionEvent evt) {
    if(count < 5) {
       for(int i=0; i<1; i++) {
         JCheckBox cb = new JCheckBox("Nr. "+count);
         cb.addMouseListener(ml);
         Vector zeile = new Vector(cb,new JLabel("label "+count));
         // das jlabel ist in der 2. spalte, stattdessen kann halt auch was anderes da hin
         v.addElement(zeile);

         count++;
      }
   }
   DefaultTableModel model = new DefaultTableModel(v,new Vector(Arrays.asList(title)));
   table.setModel(new DefaultTableModel());
}
public void loeschActionPerformed(ActionEvent evt) {
    int index = table.rowAtPoint(popup.getLocation());
    v.removeElementAt(index);
    table.getModel().setDataVector(v,new Vector(Arrays.asList(title)));
}
 
Hallo,

die erste Variante ist genau das, was ich gesucht habe, jedoch verstehe ich nicht, weshalb die Objekte in den Vector eingefügt werden, wenn damit nie etwas passiert (Sie werden einfach nur eingefügt in der hinzu-methode und wieder entfernt in der loesch-methode).
Ich habe es in meinem Code ausprobiert und es funktioniert leider nicht, die if-Abfrage ist offenbar nie Wahr!

Code:
if(c instanceof JCheckBox) { 
// Code zum entfernen der box
}

die zweite Variante ergibt dermaßen viele Fehler und ist schon so komplex, da komm ich als Anfänger nicht mehr mit :confused:

checkboxen.java:94:25: cannot find symbol
symbol : constructor Vector(javax.swing.JCheckBox,javax.swing.JLabel)
location: class java.util.Vector
Vector zeile = new Vector(cb,new JLabel("label "+count));

checkboxen.java:131:21: cannot find symbol
symbol : method setDataVector(java.util.Vector<java.util.Vector>,java.util.Vector)
location: interface javax.swing.table.TableModel
table.getModel().setDataVector(v,new Vector(Arrays.asList(title)));

Gruss
 
Ich hab die Checkboxen in den Vector hinzugefügt, falls sie noch für irgendwas anderes gebraucht werden. Wenn sie nur hinzugefügt und wieder entfernt werden kannst du den Vector natürlich weglassen.
Die instanceof-Abfrage hab ich eigentlich nur eingebaut, damit nicht andere Objekte gelöscht werden, sondern nur die JCheckBox. Die kann aber eigentlich auch weg, weil der MouseListener ja nur auf die CheckBox reagiert.

Beim zweiten hab ich wohl ein paar Fehler eingebaut (um 2 uhr nachts halt)

Code:
String title[] = new String[]{"Spalte1","Spalte2"};
Vector<Vector> v = new Vector<Vector>(0);
JTable table = new JTable();
public void hinzuActionPerformed(ActionEvent evt) {
    if(count < 5) {
       for(int i=0; i<1; i++) {
         JCheckBox cb = new JCheckBox("Nr. "+count);
         cb.addMouseListener(ml);
         Vector zeile = new Vector(0);
         zeile.addElement(cb);
         zeile.addElement(new JLabel("label "+count));
         v.addElement(zeile);

         count++;
      }
   }
   DefaultTableModel model = new DefaultTableModel(v,new Vector(Arrays.asList(title)));
   table.setModel(new DefaultTableModel());
}
public void loeschActionPerformed(ActionEvent evt) {
    int index = table.rowAtPoint(popup.getLocation());
    v.removeElementAt(index);
    ((DefaultTableModel)table.getModel()).setDataVector(v,new Vector(Arrays.asList(title)));
}
 
somit stehe ich aber fast wieder am Anfang (bis auf ein paar neu gelernte Befehle und Klassen)!

Ich habe jetzt noch ein wenig was ausprobiert, aber ich verstehe nicht, warum es nicht funktioniert...

Code:
public void hinzuActionPerformed(ActionEvent evt) {
    if(count < 5) {
         setVisible(false);
         y = y + 25;
         
         boxen[count] = new JCheckBox();
         boxen[count].setText("Nr. "+count);
         boxen[count].setBounds(15, y, 215, 25);
         boxen[count].addMouseListener(ml);
         cp.add(boxen[count]);
         count++;
         setVisible(true);
    }
  }

public void loeschActionPerformed(ActionEvent evt) {
    Component c = getContentPane().getComponentAt(popup.getLocation());

        setVisible(false);
        getContentPane().remove(c);

        setVisible(true);
        count--;
  }

das müsste doch theoretisch funktionieren... die methode remove() kann doch Component Comp annehmen, aber irgendwie passiert genau garnichts :confused:

Gruss

EDIT:
Ich habe den Fehler gefunden, die getComponent() habe ich mir ausgeben lassen und offenbar wurde dort immer wieder das popup-menü selbst ausgegeben, jetzt habe ich eine Methode getInvoker(); gefunden, welche wunderbar funktioniert

Jetzt muss ich nur noch versuchen, dass die boxen jedesmal neu geordnet werden, wenn eine entfernt wird :)

Vielen Dank für deine Hilfe!
Gruss
 
Zuletzt bearbeitet:
Zurück