Checkboxen erstellt mit MouseClicked event

Status
Nicht offen für weitere Antworten.
X

Xnor

Gast
Hallo
Vorweg, ich bin ein blutiger Anfänger.

Java:
import java.awt.event.*;

public class NewJFrame extends javax.swing.JFrame {

    public javax.swing.JCheckBox[] radioButton = new javax.swing.JCheckBox[8];
    public int[] zahlen = new int[8];

    public NewJFrame() {
        initComponents();
        setRadioButton();
    }

    public void setRadioButton() {
      int loc = 0;
      for(int i = 0; i <= 7; i++){
        radioButton[i] = new javax.swing.JCheckBox();
        radioButton[i].setBounds(16, 16+loc, 50, 17);
        radioButton[i].setText("" + (int)Math.pow(2,i));
        jPanel1.add(radioButton[i]);
        loc = loc + 15;
        radioButton[i].addMouseListener(new MyML(){
            @Override
            public void mouseClicked(MouseEvent e){
                for(int i = 0; i<=7;i++){
                    int zahl = 0;
                    if(radioButton[i].isSelected() == true){
                    zahlen[i] = (int)Math.pow(2,i);
                } else {zahlen[i] = 0;}
                    for(int v = 0; v <= 7; v++){
                        zahl = zahl + zahlen[v];
                        jLabel1.setText("" + zahl);
                    }
                }
            }
        });
      }
    }
[...]
Sieht dann in etwa so aus:


bei jedem klick auf eins der Checkboxen wird die Summe berechnet und im Label unten aktualisiert.

Mein Problem ist jetzt, dass bei einem zu schnellen anklicken der Checkboxen, die Summe nicht neu berechnet und angezeigt wird.
Ist es möglich dieses Problem zu lösen?

Vielen dank schonmal im Vorraus,
MfG Xnor
 

Developer_X

Top Contributor
kein Problem, ging uns allen mal so.
Das kannst du eig. ganz einfach regeln:
Java:
	JCheckBox[] radioButton;
	JPanel jPanel1;
	JLabel jLabel1;
    public void setRadioButton()
    {
        int loc = 0;
        int i = 0;
        
        for(i = 0; i <= 7; i++)
        {
        	radioButton[i] = new javax.swing.JCheckBox();
        	radioButton[i].setBounds(16, 16+loc, 50, 17);
        	radioButton[i].setText("" + (int)Math.pow(2,i));
        	jPanel1.add(radioButton[i]);
        	loc = loc + 15;
         	radioButton[i].addActionListener(new ActionListener()
         	{
				public void actionPerformed(ActionEvent arg0) 
				{
					if(radioButton[i].isSelected()==true)
					{
						int i = Integer.parseInt(radioButton[i].getText());
						i = Integer.parseInt(jLabel1.getText()) + i;
						jLabel1.setText(""+i);
					}
					else
					{
						int i = Integer.parseInt(radioButton[i].getText());
						i = Integer.parseInt(jLabel1.getText()) - i;
						jLabel1.setText(""+i);					
					}
					jLabel1.repaint();
				}
        	});
        }
    }

So in etwa müsste das aussehen.
Verstehst du?
Wenn du noch weitere fragen hast, stell sie ruhig.
Ich hoffe ich konnte dir helfen,

Developer_X
 
Zuletzt bearbeitet:
X

Xnor

Gast
Vielen dank für die schnelle und hilfreiche Antwort :)

kleine Anmerkung zum Quellcode von dir:
Java:
if(radioButton[i].isSelected()==true)
funktioniert so nicht, genauso wie
Java:
radioButton[i].getText()
da er das "i" nicht kennt, bzw. sagt er mir:
"local variable i accessed from within inner class; needs to be declared final" und zum zweiten "i"
"variable i might not have been initialized"

da aber mein Fehler wohl in dem event lag, hab einzig mein Quellcode diesbezüglich geändert.
Die Texte bei den RadionButtons waren nur provisorisch/vorübergehend die Zahlen die zusammen gezählt werden sollten, damit mans bisschen besser nachvollziehen kann.
Die Rechnung soll weiterhin über
Java:
(int)Math.pow(2,i)
laufen

Sieht dann nach kleiner aber feiner Veränderung so aus.

Java:
    public void setRadioButton() {
      int loc = 0;
      for(int i = 0; i <= 7; i++){
        radioButton[i] = new javax.swing.JCheckBox();
        radioButton[i].setBounds(16, 16+loc, 50, 17);
        radioButton[i].setText("D" + i);
        jPanel1.add(radioButton[i]);
        loc = loc + 15;
        radioButton[i].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0){
                for(int i = 0; i<=7;i++){
                    int zahl = 0;
                    if(radioButton[i].isSelected() == true){
                    zahlen[i] = (int)Math.pow(2,i);
                } else {zahlen[i] = 0;}
                    for(int v = 0; v <= 7; v++){
                        zahl = zahl + zahlen[v];
                        jLabel1.setText("" + zahl);
                    }
                }
            }
        });
      }
    }
Es gibt bestimmt immernoch eine Menge dran aus zu setzen und ich bin immer für weitere Verbesserungsvorschläge offen.
Vom prinzip her sollte es aber der Funktionsweise entsprechen, da die Checkboxs Namen eben anders sein werden und ich den Wert in der variable "zahl" später weiter verwenden möchte.
Das Anzeigen des Ergebnisses im Label fällt später weg und diese Methode wird nur ein kleinen Teil des Quellcodes einnehmen.

Vielen dank nochmal :)
MfG Xnor
 

eRaaaa

Top Contributor
Es gibt bestimmt immernoch eine Menge dran aus zu setzen und ich bin immer für weitere Verbesserungsvorschläge offen.

dann fang ich mal an :)
ihr erstellt 8 neue actionlistener! erstellt einen actionlistener und hängt diesen einen an alle checkboxen. die aktion ist ja an sich immer die gleiche. dann ist imo diese for-schleife innerhalb des listeners auch nicht mehr nötig, ehrlich gesagt versteh ich eh nicht was die da sucht =)
 
X

Xnor

Gast
wenn du diese For-Schleife meinst:

Java:
for(int i = 0; i<=7;i++){
                    int zahl = 0;
                    if(radioButton[i].isSelected() == true){
                    zahlen[i] = (int)Math.pow(2,i);
                } else {zahlen[i] = 0;}

ist es nach meinem geringen Wissensstand über Java die einzige Lösung, da er sonst, wie in Post #3 (von mir) beschrieben, das "i" nicht kennt, bzw. ein Fehler anzeigt.

Wie ich alle CheckBoxen an eine ActionListener anhänge weiß ich aus diesem Grund genauso wenig.

MfG Xnor
 

javimka

Top Contributor
Umgekehrt, du sollst 1 ActionListener an alle CheckBoxen ranhängen. Dazu bastelst du eine, die sogar eine for Schleife haben darf, die dann durch alle CheckBoxen durchgeht und den Wert berechnet. Mit einer weiteren for-Schleife (ausserhalb der anderen Schleife) hängst du dann diesen einen ActionListener an die CheckBoxen an.
 
X

Xnor

Gast
Umgekehrt, du sollst 1 ActionListener an alle CheckBoxen ranhängen. Dazu bastelst du eine, die sogar eine for Schleife haben darf, die dann durch alle CheckBoxen durchgeht und den Wert berechnet. Mit einer weiteren for-Schleife (ausserhalb der anderen Schleife) hängst du dann diesen einen ActionListener an die CheckBoxen an.

Vielen dank für den Ansatz,

Ich werde mich morgen ran machen und versuchen dies dann bestmöglich um zu setzen.

MfG Xnor
 

eRaaaa

Top Contributor
Umgekehrt, du sollst 1 ActionListener an alle CheckBoxen ranhängen. Dazu bastelst du eine, die sogar eine for Schleife haben darf, die dann durch alle CheckBoxen durchgeht und den Wert berechnet. Mit einer weiteren for-Schleife (ausserhalb der anderen Schleife) hängst du dann diesen einen ActionListener an die CheckBoxen an.

also ich meinte das eig. ungefähr so:
Java:
//ItemListener
     ItemListener listener = new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				JCheckBox box = (JCheckBox) e.getSource();
				if (e.getStateChange() == ItemEvent.SELECTED) {
					summe += Integer.parseInt(box.getActionCommand());
				} else {
					summe -= Integer.parseInt(box.getActionCommand());
				}
				label.setText(String.valueOf(summe));
			}
		};

//checkboxen erstellen
		JCheckBox[] boxes = new JCheckBox[8];
		JCheckBox box;
		for (int i = 0; i < boxes.length; i++) {
			box = new JCheckBox();
			box.setText((int) Math.pow(2, i) + "");
			box.setActionCommand(String.valueOf((int) Math.pow(2, i)));
//checkbox dem listener zuteilen
			box.addItemListener(listener);
			panel.add(box);
		}
 
X

Xnor

Gast
Hallo, vielen dank für das Beispiel

So ein Quellcode ist mir dann doch schon viel zu Kompiziert :D

---------------------------------------------------------
Java:
box.setActionCommand(String.valueOf((int) Math.pow(2, i)));
wenn ich das richtig verstanden hab, wird hier der Checkbox der Wert zugeteil, doch frag ich mich was es genau bedeutet, sodass ichs auch nachvollziehen kann.
"setActionCommand" und "String.valueOf" sind mir fremd.
---------------------------------------------------------
welche Funktion genau übernimmt
Java:
JCheckBox box
werden diese CheckBoxen die dann in der Schleife über "box" erstellt werden in das Array "gepackt", oder welches vorteil hat es gegenüber dieser Zeile z.B.
Java:
boxes[i] = new JCheckBox();
---------------------------------------------------------
Die ganze ItemEvent Geschichte... :)
Die IF-Abfrage kann ich mir ja durch die Übersetzung der Begriffe herleiten, doch versteh ich, wie schon oben erwähnt, die ganze Geschichte mit dem "jCheckBox box" nicht, genauso hier:
Java:
JCheckBox box = (JCheckBox) e.getSource();

Ich hoffe, dass es nicht zuviel Unwissenheit in einem Post ist und bitte um Verständnis :)

MfG Xnor
 

eRaaaa

Top Contributor
also bei mir wird garnichts in das checkboxen array gelegt (zeile 18 kannst du also ignorieren, hat sich beim copy paste eingeschlichen) bei mir werdne die checkboxen einfach aufs panel geaddet, das wars --> das ganze sollte eig. auch nur ein beispiel dazu sein, wie ich das mit dem listener gemeint habe.

JCheckBox box; übernimmt sogesehen noch garkeine funktion :)
das ist einfach nur eine deklaration.

zu dme ItemEvent. find ich hier schöner als mit actionlistener, denn so sagt mir auch gleich das event, ob nun die checkbox angeklickt, oder wegklickt wurde.
das frag ich hier ab: [c]e.getStateChange() == ItemEvent.SELECTED[/c]

[c]
JCheckBox box = (JCheckBox) e.getSource();
[/c]
e.getSource() liefert dir das objekt welches das event ausgelöst hat. in diesem fall halt eine deiner checkboxen. damit du aber auch die methoden der checkbox nutzen kannst musst du es halt auf checkbox casten(hier kannst du dir ja sicher sein dass es sich um eine checkbox handeln muss).
so kann ich mir jetzt mittels box.getActionCommand() den wert holen, den ich vorher mit setActionCommand gesetzt habe(hier halt der wert (int) Math.pow(2, i)). diesen wert addiere ich nun, oder subtrahiere, je nachdem was getStateChanged mir geliefert hat.

aber eig. sollte dich das alles garnicht irritieren, sorry! ich wollte eig. eher auf die sache mit dem listener hinaus ;(
 
X

Xnor

Gast
Hallo

Kleine Anpassung des Quellcodes von "eRaaaa":
Java:
    public int zahl;
    public JCheckBox[] radioButton = new JCheckBox[8];    

    public void setRadioButton(){
        JCheckBox box;
        int loc = 0;

        ItemListener listener = new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                JCheckBox box = (JCheckBox) e.getSource();
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    zahl += Integer.parseInt(box.getActionCommand());
                } else {
                    zahl -= Integer.parseInt(box.getActionCommand());
                }
                spin1.setValue(zahl);
            }
        };

        for (int i = 0; i < 8; i++) {
            box = new JCheckBox();
            box.setText("D" + i);
            box.setBounds(16, 54+loc, 40, 17);
            box.setActionCommand(String.valueOf((int) Math.pow(2, i)));
            loc = loc + 25;

            box.addItemListener(listener);
            radioButton[i] = box;
            jPanel3.add(box);
        }
    }

dazu ist jetzt noch ein Spinner dazugekommen, der bei Veränderung die CheckBoxen anders Selektiert:
(dank eurem Quellcode hergeleitet :))
Java:
    public JSpinner spin1;

    public void setSpinner(){
         //JSpinner erstellen
         spin1 = new JSpinner();
         spin1.setBounds(17, 251, 53, 20);
         jPanel3.add(spin1);

         //Zahlenbereich festlegen
         SpinnerModel model = new SpinnerNumberModel(0,0,255,1);
         spin1.setModel(model);

         //Event
         ChangeListener listener = new ChangeListener(){
             public void stateChanged(ChangeEvent e){
                 int wert = Integer.parseInt(spin1.getValue().toString());
                    for(int i = 0; i <= 7; i++){
                        if(wert%2 == 1){
                            radioButton[i].setSelected(true);
                            wert = wert / 2;
                        } else {
                            radioButton[i].setSelected(false);
                            wert = wert / 2;
                        }
                    }
             }
         };
         spin1.addChangeListener(listener);
    }

Funktioniert einbahnfrei alles und so ist dieses Thema auch im grunde gelöst.
Für Verbesserungsvorschläge bin ich denoch jederzeit offen.

Vielen dank nochmal für alle Antworten.

MfG Xnor
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U JavaFX CheckBoxen in GUI verschieben AWT, Swing, JavaFX & SWT 20
D JavaFX Dynamisch erzeugte Checkboxen aus VBox auslesen AWT, Swing, JavaFX & SWT 3
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
T Dynamisch mehrere Checkboxen anlegen AWT, Swing, JavaFX & SWT 2
D Seltsames Verhalten meiner CheckBoxen AWT, Swing, JavaFX & SWT 7
S Swing Checkboxen in Einträgen des Typs DefaultMutableTreeNode AWT, Swing, JavaFX & SWT 23
M Swing CheckBoxen werden nicht in jTable angezeigt AWT, Swing, JavaFX & SWT 3
S AWT Erstellen von Checkboxen AWT, Swing, JavaFX & SWT 33
M Checkboxen Namen setzten über Parameter => Abfragen? AWT, Swing, JavaFX & SWT 2
F checkboxen auslesen/ansprechen AWT, Swing, JavaFX & SWT 1
J Hintergrundfarbe von CheckBoxen in einer JTable AWT, Swing, JavaFX & SWT 4
T JTree mit Checkboxen anpassen AWT, Swing, JavaFX & SWT 7
R Checkboxen - Event mit Controller abfangen AWT, Swing, JavaFX & SWT 7
S swt table mit checkboxen: wie nachträglich im code setzen? AWT, Swing, JavaFX & SWT 6
D Mehrere CheckBoxen im TableModel wechselseitig ausschließen AWT, Swing, JavaFX & SWT 5
G Namen mehrer Checkboxen abfragen AWT, Swing, JavaFX & SWT 7
F Checkboxen in JTable abfragen AWT, Swing, JavaFX & SWT 2
M@rk Jtree Checkboxen AWT, Swing, JavaFX & SWT 2
G JTree mit Checkboxen und Problem mit isSelected() AWT, Swing, JavaFX & SWT 2
G Aktionen bei Checkboxen AWT, Swing, JavaFX & SWT 2
R Checkboxen plazieren AWT, Swing, JavaFX & SWT 3
M JList mit checkboxen AWT, Swing, JavaFX & SWT 2
O Dynamische Checkboxen AWT, Swing, JavaFX & SWT 21
TheJavaKid .isSelected() bei AWT Checkboxen? AWT, Swing, JavaFX & SWT 2
F Checkboxen eines anderen Panels ansprechen AWT, Swing, JavaFX & SWT 3
C Checkboxen bzw. CheckboxGroup AWT, Swing, JavaFX & SWT 3
T Checkboxen layouten AWT, Swing, JavaFX & SWT 20
berserkerdq2 Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe AWT, Swing, JavaFX & SWT 10
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
ralfb1105 jTextArea Scrollbar hinzufügen - mit Jigloo erstellt AWT, Swing, JavaFX & SWT 7
F JavaFX Custom ListView erstellt ghost Element AWT, Swing, JavaFX & SWT 3
L Swing JComboBox kann nicht erstellt werden! AWT, Swing, JavaFX & SWT 2
D [Anfänger]ComboBox erstellt Einträge in einer anderen ComboBox AWT, Swing, JavaFX & SWT 3
wolfgang63 JavaFX Zugriff auf Guiobjekte die über FXML erstellt wurden AWT, Swing, JavaFX & SWT 2
V JFrame wird dank "dauerschleife" nicht erstellt AWT, Swing, JavaFX & SWT 3
G Label wird nicht erstellt AWT, Swing, JavaFX & SWT 0
L Buttons aus Arrayliste erstellt wie komm ich nun wieder an das Oobjekt aus der arrayliste ran AWT, Swing, JavaFX & SWT 3
M Im Frame wird nur die Menüleiste erstellt und nicht die Tabelle? AWT, Swing, JavaFX & SWT 3
data89 Wie erstellt man ein anspruchsvolles GUI? AWT, Swing, JavaFX & SWT 18
L Dynamische Buttons erstellt, aber wie ein Event zuweisen? AWT, Swing, JavaFX & SWT 11
O Graphics erstellt Componente scheinbar nicht richtig AWT, Swing, JavaFX & SWT 23
B Label wird ungewollt mehrmals erstellt AWT, Swing, JavaFX & SWT 4
B Wie erstellt man so eine Gui? AWT, Swing, JavaFX & SWT 5
W Swing Bei einem 2-dimensionalen array, bei mouseClicked index zuordnen AWT, Swing, JavaFX & SWT 2
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
G JTree mouseClicked -> kontrolle ob noch ein unterknoten e AWT, Swing, JavaFX & SWT 2
M mouseClicked in SWT AWT, Swing, JavaFX & SWT 2
S Einfacher Klick aber mouseClicked() zweimal aufgerufen AWT, Swing, JavaFX & SWT 3
M Wenn Mausgehalten wird MousePressed ansonsten MouseClicked? AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben