Swing JMenuButtons mit Funktionen aus Array erstellen

Blagg Dogg

Mitglied
hiho,

ich möchte ein programm schreiben, das mir zufällige konstellationen aus personen, orten, handlungen etc. liefert. in der menüleiste habe ich für jedes feld (personen, orten, handlungen etc) ein menu, wo ich die jeweiligen sachen aus, oder abwählen kann - also ob sie mit in die auswahl aufgenommen werden sollen. dann soll aus einem eintrag "Magier" "-> Magier" werden und das jeweilige wort in die jeweilige arraylist (hier: activePersonen) mit aufgenommen werden. bei erneutemm klicken soll es wieder rückgängig gemacht werden. allerdings funktioniert das so leider nicht... ich weiß auch, wieso nicht, aber ich weiß nicht, wie ich das hinbekomme... :((

jemand ne idee?

Java:
package de.sack;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.*;

public class RandomStory extends JFrame {
	
	// Einige Werte zu Testzwecken
	protected String[] personen={"Dieb", "Magier", "Jäger"};
	protected String[] orte={"Waldhütte"};
	protected String[] jahreszeiten={"Winter", "Frühling", "Sommer", "Herbst"};
	protected String[] tageszeiten={"Nacht", "Morgen", "Mittag", "Abend"};
	protected String[] handlungen={"mord"};
	
	
	protected ArrayList<String> activePersonen;
	protected ArrayList<String> activeOrte;
	protected ArrayList<String> activeJahreszeiten;
	protected ArrayList<String> activeTageszeiten;
	protected ArrayList<String> activeHandlung;
	
	int i; //Zählervariable;
	JMenuItem temp;
	String tempStr;
	
	public RandomStory(){

		activePersonen = new ArrayList<String>();
		activeOrte = new ArrayList<String>();
		activeJahreszeiten = new ArrayList<String>();
		activeTageszeiten = new ArrayList<String>();
		activeHandlung = new ArrayList<String>();
		
		setTitle("Creative Stories (c) 2012");
		setSize(new Dimension(800,200));
		setLocationRelativeTo(null);
		final Random r = new Random();

		
		
		/*************Menü-Leiste**************************/
		JMenuBar leiste = new JMenuBar();
		
		
		// Hauptmenü
		JMenu main = new JMenu("Programm");
		JMenuItem close = new JMenuItem("Beenden");
		close.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				System.exit(0);
				
			}
		});
		main.add(close);
		leiste.add(main);
		
		// Personen
		JMenu personenMenu = new JMenu("Personen");
		
		for (i=0; i<personen.length; i++){
			temp = new JMenuItem(personen[i]);
			personenMenu.add(temp);
			tempStr = personen[i];
			temp.addActionListener(new ActionListener() {
			
				@Override
				public void actionPerformed(ActionEvent arg0) {
					
					
//					if(!activePersonen.contains(personen[i])) {
//						activePersonen.add(personen[i]);
//						temp.setText("-> "+tempStr); 
						// führt zu einer ArrayIndexOutOfBoundsException
//					} else {
//						activePersonen.remove(personen[i]);
//						temp.setText(personen[i]);						
//					}
					
				}
			});
		}
		
		leiste.add(personenMenu);
		
		
		// weitere Menüs für Orte, Handlungen etc...
		
		
		
		

		setJMenuBar(leiste);
		/***************Ende Menü-Leiste*******************/
		
		final JLabel anzeige = new JLabel("Willkommen");
		getContentPane().add(anzeige, BorderLayout.NORTH);
	
		
		JButton generator = new JButton("Generate");
		generator.setSize(50, 10);
		generator.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				//anzeige.setText("Works");
				
			}
		});
		add(generator, BorderLayout.SOUTH);
		this.getRootPane().setDefaultButton(generator);
				
		
		//setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
	}
	
	public static void main(String [] args){
		new RandomStory().setVisible(true);
		
	}

}
 

Denny88

Mitglied
Hi Blagg Dogg,

ich kann dir auch sagen warum da eine IndexOutOfBoundException kommt. Das Problem ist, dass beim ActionListener hinter "temp" und "i" nicht das steckt, was du erwartest. Wenn actionPerformed ausgeführt wird, dann ist temp das in der for-Schleife zuletzt zugewiesene Objekt und i hat immer die Länge der ArrayList und kann daher nicht als Index verwendet werden.

Mein Vorschlag ist, CheckBoxMenuItem(s) zu verwenden, wenn du auf den "->" verzichten kannst. Dann kannst du das mal so versuchen:
Java:
         for (i=0; i<personen.length; i++){
            temp = new JCheckBoxMenuItem(personen[i]);
            personenMenu.add(temp);
            temp.addActionListener(new ActionListener() {
            
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    
                  JCheckBoxMenuItem srcObj = (JCheckBoxMenuItem)(arg0.getSource());
                  if(srcObj.getState()) {
                      activePersonen.add(srcObj.getText());
                  } else {
                      activePersonen.remove(srcObj.getText());                 
                  }
                  //Testausgabe von activePersonen
                  System.out.println(activePersonen);
                }
            });
        }

Man kann auch statt "if(srcObj.getState())" alternativ auch mit "if(!activePersonen.contains(srcObj.getText()))" überprüfen, ob der Text in der ArrayList befindet. Oder sollte man das sogar sicherheitshalber? Ich weiß es ehrlich gesagt nicht, ob das nötig ist :D Aber so geht es auf jeden Fall und ich hoffe das hilft dir weiter.

LG
Daniel
 
Zuletzt bearbeitet:

Blagg Dogg

Mitglied
thx... verstehe es noch nicht ganz, aber es geht :)

noch eine frage: ist es möglich, dass sich das menü nach auswählen einer checkbox nicht schließt?
 

Denny88

Mitglied
Ja, natürlich geht das ... Sorry, hätte da auch ein bischen im voraus mitdenken können. Verwende statt CheckBoxMenuItem einfach CheckBox und dann klappt das schon ;)

LG
Daniel
 

Denny88

Mitglied
Also,

beim Aufruf von ActionPerformed() im ActionListener wird geschaut was "jetzt" zu diesem Zeitpunkt in i und temp steht. Zu diesen Zeitpunkt ist die Schleife ja schon durchgelaufen und i ist demnach personen.lentght + 1 , da ich i ja um ein größer sein muss, damit die Bedingung für die Schleife nicht mehr erfüllt ist. Deshalb wird immer eine IndexOutOfBoundException geworfen. temp wird auch immer das zuletzt zugewiesene Objekt aus personen beinhalten, da hier auch nach der Schleife erst nachgeschaut wird, was dahinter steckt. Aber das ist eigentlich eher nebensächlich. Das Kernproblem war, dass du jedem Objekt einen ActionListener hattest, der personen verwendete. Da aber i zum Zeitpunkt des Zugriffs in allen Listenern "gleich" ist, da ja erst jetzt nachgeschaut was in i steht, hättest du nie verschiedene Namen aus personen in activePersonen kopieren können, sondern immer nur den i-ten, egal auf welchen Namen du im Menü geklickt hättest. Wegen temp wird sich nur immer der Text des letzten Elementes in deinem Menu ändern. Deine Idee war ja sicher, dass er schon innerhalb der Schleife nachgeschaut wird, was in personen steht und dies dann im ActionListener zu verwenden. Dies ist aber leider nicht so :noe:

Zum neuen Code:
Es ist eigentlich simpel. Die Zuweisung der ActionListener hat ja über die for-Schleife ganz gut geklappt.
In ActionPerformed holt er sich dann mit arg0.getSource() das Objekt, welches zu dem ActionListener gehört, der momentan ausgeführt wird. Da es sich bei dem Objekt um ein JComboMenuItem handelt, kann man sich von ihm einfach mit srcObj.getText() seinen Text holen. Vorher muss aber noch gecastet werden, damit das Objekt die Methode getText() verwenden kann. Mit srcObj.getState() kann man überprüfen, ob ein Haken gesetzt (true) oder entfernt (false) wurde.

Ich hoffe das war einigermaßen verständlich :) Ich kann es dir aber auch am MI in der FH nochmal erklären, wenn du magst ;)

LG
Daniel
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JButtons erstellen lassen mit unterschiedlichen Funktionen AWT, Swing, JavaFX & SWT 3
S Funktionen in einem Stopuhrprogramm AWT, Swing, JavaFX & SWT 4
M Suche Javabibliothek zum Zeichnen mathematischer Funktionen AWT, Swing, JavaFX & SWT 11
W Funktionen, sowie aufruf einiger Komponenten AWT, Swing, JavaFX & SWT 4
C Funktionen zeichnen AWT, Swing, JavaFX & SWT 16
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
V JComboBox mit besonderen Funktionen erweitern AWT, Swing, JavaFX & SWT 3
T Drag & Drop Funktionen AWT, Swing, JavaFX & SWT 9
K Titelleiste ihrer Funktionen berauben AWT, Swing, JavaFX & SWT 6
J JTableModel Funktionen überschreiben AWT, Swing, JavaFX & SWT 4
H funktionen in ein koordinatensystem zeichen AWT, Swing, JavaFX & SWT 5
M Plotten mit Java (Funktionen, Vektoren etc) AWT, Swing, JavaFX & SWT 1
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
L Swing Wert vom Textfield in Array List hinzufügen AWT, Swing, JavaFX & SWT 2
A 2d array AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
M Swing Objekt Array in GUI ausgeben AWT, Swing, JavaFX & SWT 1
N Array mit JavaFX Elementen AWT, Swing, JavaFX & SWT 9
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
J index im Array aussuchen AWT, Swing, JavaFX & SWT 1
J JavaFX von einem Array aus Buttons herausfinden auf welcher geklickt wurde aus dem Array. AWT, Swing, JavaFX & SWT 1
G JavaFX Fenster 1 Array übertragen zur Fenster 2 AWT, Swing, JavaFX & SWT 0
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
F JList auffüllen aus Array von Instanzen AWT, Swing, JavaFX & SWT 4
kilopack15 JLabels im Array erzeugen AWT, Swing, JavaFX & SWT 2
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
M JavaFX - Array in View auslesen AWT, Swing, JavaFX & SWT 12
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
E AWT Bilder als "Array" abspeichern. AWT, Swing, JavaFX & SWT 4
J JavaFX Buttons mit Array erzeugen AWT, Swing, JavaFX & SWT 1
beatles Swing JTextField - Game Status aus Array anzeigen AWT, Swing, JavaFX & SWT 3
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
Viktim Array Spielfeld wird in GUI gedreht AWT, Swing, JavaFX & SWT 5
T JTextField Array im JPanel wird nicht komplett angezeigt AWT, Swing, JavaFX & SWT 7
S AWT JTextFields durch Array im JMenu erzeugen? AWT, Swing, JavaFX & SWT 19
L JComponents in Array AWT, Swing, JavaFX & SWT 11
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
B Array Java AWT, Swing, JavaFX & SWT 0
S JTable Daten aus Array AWT, Swing, JavaFX & SWT 9
K Array von einer Action zur anderen bringen AWT, Swing, JavaFX & SWT 7
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
O 2D Weltgenerieren - 2D Array AWT, Swing, JavaFX & SWT 1
W Bei Button-klick neuen button in array hinzufügen AWT, Swing, JavaFX & SWT 7
H Image im Array per Knopfdruck ändern AWT, Swing, JavaFX & SWT 6
A JComboBox mit Array aktualisieren AWT, Swing, JavaFX & SWT 7
L Zwei String Array in eine Spalte einfügen AWT, Swing, JavaFX & SWT 1
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
L 2D-Grafik PNG Datei in JLabel Array Problem AWT, Swing, JavaFX & SWT 4
R Array aus einem Objekt auslesen AWT, Swing, JavaFX & SWT 4
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
A Array von JLabel mit Grafiken anzeigen AWT, Swing, JavaFX & SWT 3
J 2D-Grafik String aus array wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
S Swing Jcombobox und array AWT, Swing, JavaFX & SWT 6
M Swing Array aus anderer Klasse AWT, Swing, JavaFX & SWT 6
M Array grafisch darstellen AWT, Swing, JavaFX & SWT 9
P 2D-Grafik versch. Rectangles aus array von textfelder zeichen AWT, Swing, JavaFX & SWT 6
V Swing Componenten Array AWT, Swing, JavaFX & SWT 3
P Grauwerte aus 3-Dimensionalem Array in Bild AWT, Swing, JavaFX & SWT 9
F Bilder werden nicht in's Array geladen AWT, Swing, JavaFX & SWT 4
A JComboBox-Inhalt durch neues Array ersetzen AWT, Swing, JavaFX & SWT 2
A JButton in einem Array aktualisieren AWT, Swing, JavaFX & SWT 8
K Applet Wieso kann ich keine Array im Applet initialisieren AWT, Swing, JavaFX & SWT 13
S String Array Ausgabe im JLabel ??? AWT, Swing, JavaFX & SWT 8
L Fehler beim erstellen einer Tabelle mithilfe von 2d-Array AWT, Swing, JavaFX & SWT 3
H 2D-Grafik BufferedImage aus Integer-Array AWT, Swing, JavaFX & SWT 3
H Puzzle - Listen erstellen, array & liste vergleichen AWT, Swing, JavaFX & SWT 28
H Puzzle - Erkennen wenn gelöst (array vergleichen) AWT, Swing, JavaFX & SWT 10
H Bilder in Array zufällig anordnen AWT, Swing, JavaFX & SWT 4
W Swing Bei einem 2-dimensionalen array, bei mouseClicked index zuordnen AWT, Swing, JavaFX & SWT 2
Jats Bitte um Hilfe bei JComboBox mit Array AWT, Swing, JavaFX & SWT 6
N Swing Von 2 dimensionalem Array auf JTextfield schließen und färben AWT, Swing, JavaFX & SWT 6
H JList zeigt die Daten aus dem Array nicht an! AWT, Swing, JavaFX & SWT 13
M Swing Zweidimensionales Array mit Farben erzeugen AWT, Swing, JavaFX & SWT 16
W Button Array ? AWT, Swing, JavaFX & SWT 10
X JLabel und mehrdimensionales Array AWT, Swing, JavaFX & SWT 2
T Swing 2d Array zeichnen AWT, Swing, JavaFX & SWT 4
M ArrayList in 2D Array umfüllen AWT, Swing, JavaFX & SWT 9
F Swing String Array mit JTextArea anzeigen AWT, Swing, JavaFX & SWT 13
E ResultSet als Array an JTable übergeben AWT, Swing, JavaFX & SWT 9
D Bild zeichnen lassen aus array, null pointer Exception AWT, Swing, JavaFX & SWT 2
D Pixel in ein Array einlesen AWT, Swing, JavaFX & SWT 2
S Koordinaten aus Array verwenden zum zeichnen auf JPanel?! AWT, Swing, JavaFX & SWT 3
Developer_X Verzwicktes Problemchen mit Panel-Array AWT, Swing, JavaFX & SWT 5
JavaKaffee Array auslesen in jTextPane? AWT, Swing, JavaFX & SWT 9
N Swing Problem beim Einlesen von Jtable in Array AWT, Swing, JavaFX & SWT 5
S Swing ComboBox aus Array befüllen AWT, Swing, JavaFX & SWT 2
T Swing JTable und mehrdimensionales Array AWT, Swing, JavaFX & SWT 2
D Verschiedene ActionEvents für ein JButton-Array AWT, Swing, JavaFX & SWT 2
B Keine Änderungen an JLabel durch Array möglich AWT, Swing, JavaFX & SWT 12
W Objekt-array als Raster visualisieren AWT, Swing, JavaFX & SWT 3
C JPanel-Array in GridLayout AWT, Swing, JavaFX & SWT 4
S Array+INfoBox AWT, Swing, JavaFX & SWT 7
A Array wird im JOptionPane mehrfach ausgegeben AWT, Swing, JavaFX & SWT 3
B JButton+Array AWT, Swing, JavaFX & SWT 2
R zweidim. JButton-Array in Schleife -> NullPointerExceptio AWT, Swing, JavaFX & SWT 2
D Fehler bei Button Array AWT, Swing, JavaFX & SWT 8
S Suchen im String-Array AWT, Swing, JavaFX & SWT 3
M Separator in Array AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben