StackOverFlow, finde Grund nicht!

Lybrial

Bekanntes Mitglied
Wie der Titel schon sagt, vielleicht mir jemand weiterhelfen.

Habe hier eine Klasse für JSpinner und JTextfields um ihr später auf
einfache Art und Weise Methoden zu geben, gewisse Eingaben in den
Textfelder und JSpinnern zu überprüfen.

Java:
package View;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import Model.EventFileHandler;

public class UICreateEventTextFields implements ChangeListener{
	private EventFileHandler eventFileHandler = new EventFileHandler();
	private JTextField textFieldNameOfEvent = new JTextField();
	private JTextField textFieldLocation = new JTextField();
	private JSpinner spinnerDayStart, spinnerMonthStart, spinnerYearStart;
	private JSpinner spinnerStartTimeHour, spinnerStartTimeMinute;
	private JSpinner spinnerDayEnd, spinnerMonthEnd, spinnerYearEnd;
	private JSpinner spinnerEndTimeHour, spinnerEndTimeMinute;
	private JSpinner spinnerLoopEndDay, spinnerLoopEndMonth, spinnerLoopEndYear;
    private String[] comboBoxString = {"Nicht wiederholen", "Taeglich wiederholen", "Woechentlich wiederholen", "Jaehrlich wiederholen"};
	private JComboBox comboBoxIsLoop = new JComboBox(comboBoxString);
	public int mComboBoxItem;
	private Dimension dimSmall = new Dimension(67, 20);
	private Dimension dimBig = new Dimension(120, 20);
	//*****Konstruktor***********************
	public UICreateEventTextFields(){}
	//*********************************************************************
	public JTextField textFieldNameOfEvent(){
		textFieldNameOfEvent.setPreferredSize(new Dimension(180, 20));
		return textFieldNameOfEvent;
	}
	//*********************************************************************
	public JTextField textFieldLocation(){
		textFieldLocation.setPreferredSize(new Dimension(180, 20));
		return textFieldLocation;
	}
	//*********************************************************************
	public JSpinner spinnerDayStart(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerDayStart = new JSpinner(model);
		spinnerDayStart.addChangeListener(this);
		spinnerDayStart.setSize(dimSmall);
		return spinnerDayStart;
	}
	//*********************************************************************
	public JSpinner spinnerMonthStart(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerMonthStart = new JSpinner(model);
//		spinnerMonthStart.addChangeListener(this);
		spinnerMonthStart.setSize(dimSmall);
		return spinnerMonthStart;
	}
	//*********************************************************************
	public JSpinner spinnerYearStart(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerYearStart = new JSpinner(model);
//		spinnerYearStart.addChangeListener(this);
		spinnerYearStart.setSize(dimSmall);
		return spinnerYearStart;
	}
	//*********************************************************************
	public JSpinner spinnerStartTimeHour(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerStartTimeHour = new JSpinner(model);
//		spinnerStartTimeHour.addChangeListener(this);
		spinnerStartTimeHour.setSize(dimSmall);
		return spinnerStartTimeHour;
	}
	//*********************************************************************
	public JSpinner spinnerStartTimeMinute(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerStartTimeMinute = new JSpinner(model);
//		spinnerStartTimeMinute.addChangeListener(this);
		spinnerStartTimeMinute.setSize(dimSmall);
		return spinnerStartTimeMinute;
	}
	//*********************************************************************
	public JSpinner spinnerDayEnd(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerDayEnd = new JSpinner(model);
//		spinnerDayEnd.addChangeListener(this);
		spinnerDayEnd.setSize(dimSmall);
		return spinnerDayEnd;
	}
	//*********************************************************************
	public JSpinner spinnerMonthEnd(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerMonthEnd = new JSpinner(model);
//		spinnerMonthEnd.addChangeListener(this);
		spinnerMonthEnd.setSize(dimSmall);
		return spinnerMonthEnd;
	}
	//*********************************************************************
	public JSpinner spinnerYearEnd(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerYearEnd = new JSpinner(model);
//		spinnerYearEnd.addChangeListener(this);
		spinnerYearEnd.setSize(dimSmall);
		return spinnerYearEnd;
	}
	//*********************************************************************
	public JSpinner spinnerEndTimeHour(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerEndTimeHour = new JSpinner(model);
//		spinnerEndTimeHour.addChangeListener(this);
		spinnerEndTimeHour.setSize(dimSmall);
		return spinnerEndTimeHour;
	}
	//*********************************************************************
	public JSpinner spinnerEndTimeMinute(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerEndTimeMinute = new JSpinner(model);
//		spinnerEndTimeMinute.addChangeListener(this);
		spinnerEndTimeMinute.setSize(dimSmall);
		return spinnerEndTimeMinute;
	}
	//*********************************************************************
	public JSpinner spinnerLoopEndDay(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerLoopEndDay = new JSpinner(model);
//		spinnerLoopEndDay.addChangeListener(this);
		spinnerLoopEndDay.setSize(dimBig);
		return spinnerLoopEndDay;
	}
	//*********************************************************************
	public JSpinner spinnerLoopEndMonth(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerLoopEndMonth = new JSpinner(model);
//		spinnerLoopEndMonth.addChangeListener(this);
		spinnerLoopEndMonth.setSize(dimBig);
		return spinnerLoopEndMonth;
	}
	//*********************************************************************
	public JSpinner spinnerLoopEndYear(int set, int min, int max, int step){
		SpinnerNumberModel model = new SpinnerNumberModel(set, min, max, step);
		spinnerLoopEndYear = new JSpinner(model);
//		spinnerLoopEndYear.addChangeListener(this);
		spinnerLoopEndYear.setSize(dimBig);
		return spinnerLoopEndYear;
	}
	//*********************************************************************
	public JComboBox comboBoxIsLoop(){
		comboBoxIsLoop.setPreferredSize(new Dimension(380, 20));
		comboBoxIsLoop.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				mComboBoxItem = comboBoxIsLoop.getSelectedIndex();
			}
		});
		return comboBoxIsLoop;
	}
	//*********************************************************************
	public int checkNameOfEvent(JTextField aTextField){
		for(int i = 0; i < eventFileHandler.getEventList().getLastIndex(); i++){
			if(eventFileHandler.getEventList().getEventArray()[i] == null){
				continue;
			}
			if(eventFileHandler.getEventList().getEventArray()[i].getName().equals(textFieldNameOfEvent.getText())){
				return 0;
			}
		}
		return 1;
	}
	//*********************************************************************
	public void stateChanged(ChangeEvent e){
		JSpinner spinner = (JSpinner)e.getSource();
		SpinnerNumberModel model = (SpinnerNumberModel)spinner.getModel();
		if(spinner.getValue().equals(model.getMinimum())){
			spinner.setValue(model.getMaximum());
		}else if(spinner.getValue().equals(model.getMaximum())){
			spinner.setValue(model.getMinimum());
		}
	}
}

Diese Klasse baut die JSpinner und TextFields in einem Fenster zusammen:

Java:
package View;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import Controller.WorkerCreateEvent;
import Model.Event;

public class UICreateEvent{
	private GregorianCalendar cal = new GregorianCalendar();
	private Event mEvent;
	private UICreateEventTextFields uiTextFields = new UICreateEventTextFields();
	private JFrame frame = new JFrame("Termin erstellen");
	private JPanel mainPanel = new JPanel();
	private JPanel panelTop = new JPanel();
	private JPanel panelStart = new JPanel();
	private JPanel panelEnd = new JPanel();
	private JPanel panelName = new JPanel();
	private JPanel panelLocation = new JPanel();
	private JPanel panelKindOf = new JPanel();
	private JPanel panelStartDate = new JPanel();
	private JPanel panelStartTime = new JPanel();
	private JPanel panelEndDate = new JPanel();
	private JPanel panelEndTime = new JPanel();
	private JPanel panelLoop = new JPanel();
	private JPanel panelButtons = new JPanel();
	private JButton buttonCreate = new JButton("OK");
	private JButton buttonCancel = new JButton("Abbrechen");
	private Color gray = new Color(100, 100, 100);
	//*****Konstruktor***********************
	public UICreateEvent(Event aEvent){
		mEvent = aEvent;
		initEventDatas();
	}
	//*********************************************************************
	public void mainWindow(){
		frame.setResizable(false);
		frame.add(mainPanel());
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
	//*********************************************************************
	private JPanel mainPanel(){
		mainPanel.setLayout(new GridLayout(0, 1));
		mainPanel.add(panelTop());
		mainPanel.add(panelKindOf());
		mainPanel.add(panelStart());
		mainPanel.add(panelEnd());
		mainPanel.add(panelLoop());
		mainPanel.add(panelButtons());
		return mainPanel;
	}
	//*********************************************************************
	private JPanel panelTop(){
		panelTop.setLayout(new BorderLayout());
		panelTop.add(panelName(), BorderLayout.WEST);
		panelTop.add(panelLocation(), BorderLayout.EAST);
		return panelTop;
	}
	//*********************************************************************
	private JPanel panelStart(){
		panelStart.setLayout(new BorderLayout());
		panelStart.add(panelStartDate(), BorderLayout.WEST);
		panelStart.add(panelStartTime(), BorderLayout.EAST);
		return panelStart;
	}
	//*********************************************************************
	private JPanel panelEnd(){
		panelEnd.setLayout(new BorderLayout());
		panelEnd.add(panelEndDate(), BorderLayout.WEST);
		panelEnd.add(panelEndTime(), BorderLayout.EAST);
		return panelEnd;
	}
	//*********************************************************************
	private JPanel panelName(){
		panelName.add(uiTextFields.textFieldNameOfEvent());
		panelName.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Name"));
		return panelName;
	}
	//*********************************************************************
	private JPanel panelLocation(){
		panelLocation.add(uiTextFields.textFieldLocation());
		panelLocation.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Ort"));
		return panelLocation;
	}
	//*********************************************************************
	private JPanel panelKindOf(){
		panelKindOf.add(uiTextFields.comboBoxIsLoop());
		panelKindOf.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Termin wiederholen?"));
		return panelKindOf;
	}
	//*********************************************************************
	private JPanel panelStartDate(){
		panelStartDate.add(uiTextFields.spinnerDayStart(cal.get(Calendar.DATE), 0, cal.getActualMaximum(Calendar.DAY_OF_MONTH) + 1, 1));
		panelStartDate.add(uiTextFields.spinnerMonthStart(cal.get(Calendar.MONTH), 0, cal.getActualMaximum(Calendar.MONTH) + 1, 1));
		panelStartDate.add(uiTextFields.spinnerYearStart(cal.get(Calendar.YEAR), 0, cal.getActualMaximum(Calendar.YEAR) + 1, 1));
		panelStartDate.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Start-Datum"));
		return panelStartDate;
	}
	//*********************************************************************
	private JPanel panelStartTime(){
		panelStartTime.add(uiTextFields.spinnerStartTimeHour(cal.get(Calendar.HOUR), 0, cal.getActualMaximum(Calendar.HOUR) + 1, 1));
		panelStartTime.add(uiTextFields.spinnerStartTimeMinute(cal.get(Calendar.MINUTE), 0, cal.getActualMaximum(Calendar.MINUTE) + 1, 1));
		panelStartTime.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Start-Zeit"));
		return panelStartTime;
	}
	//*********************************************************************
	private JPanel panelEndDate(){
		panelEndDate.add(uiTextFields.spinnerDayEnd(cal.get(Calendar.DATE) + 1, 0, cal.getActualMaximum(Calendar.DAY_OF_MONTH) + 1, 1));
		panelEndDate.add(uiTextFields.spinnerMonthEnd(cal.get(Calendar.MONTH), 0, cal.getActualMaximum(Calendar.MONTH) + 1, 1));
		panelEndDate.add(uiTextFields.spinnerYearEnd(cal.get(Calendar.YEAR), 0, cal.getActualMaximum(Calendar.YEAR) + 1, 1));
		panelEndDate.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "End-Datum"));
		return panelEndDate;
	}
	//*********************************************************************
	private JPanel panelEndTime(){
		panelEndTime.add(uiTextFields.spinnerEndTimeHour(cal.get(Calendar.HOUR) + 1, 0, cal.getActualMaximum(Calendar.HOUR) + 1, 1));
		panelEndTime.add(uiTextFields.spinnerEndTimeMinute(cal.get(Calendar.MINUTE), 0, cal.getActualMaximum(Calendar.MINUTE) + 1, 1));
		panelEndTime.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "End-Zeit"));
		return panelEndTime;
	}
	//*********************************************************************
	private JPanel panelLoop(){
		panelLoop.add(uiTextFields.spinnerLoopEndDay(cal.get(Calendar.DATE), 0, cal.getActualMaximum(Calendar.DATE) + 1, 1));
		panelLoop.add(uiTextFields.spinnerLoopEndMonth(cal.get(Calendar.MONTH) + 1, 0, cal.getActualMaximum(Calendar.MONTH) + 1, 1));
		panelLoop.add(uiTextFields.spinnerLoopEndYear(cal.get(Calendar.YEAR), 0, cal.getActualMaximum(Calendar.YEAR) + 1, 1));
		panelLoop.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Wiederholungs-Ende"));
		return panelLoop;
	}
	//*********************************************************************
	private JPanel panelButtons(){
		panelButtons.setLayout(new BorderLayout());
		panelButtons.add(buttonCreate(), BorderLayout.CENTER);
		panelButtons.add(buttonCancel(), BorderLayout.EAST);
		return panelButtons;
	}
	//*********************************************************************
	private JButton buttonCreate(){
		buttonCreate.setPreferredSize(new Dimension(190, 20));
		buttonCreate.setBackground(gray);
		buttonCreate.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				WorkerCreateEvent workerCreateEvent = new WorkerCreateEvent();
				workerCreateEvent.setDatas(uiTextFields.textFieldNameOfEvent().getText(),
										uiTextFields.textFieldLocation().getText());
			}
		});
		return buttonCreate;
	}
	//*********************************************************************
	private JButton buttonCancel(){
		buttonCancel.setPreferredSize(new Dimension(190, 20));
		buttonCancel.setBackground(gray);
		buttonCancel.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				frame.dispose();
			}
		});
		return buttonCancel;
	}
	//*********************************************************************
	private void initEventDatas(){
		cal.set(mEvent.getStartYear(), mEvent.getStartMonth(), mEvent.getStartDay());
	}
}

Böser StackOverFlow. Findets einer? 🙂
 
Stackoverflow gibts meistens bei Methoden, die sich selbst aufrufen (evtl. auch über mehrere Schritte). Dann kommt man in eine endlos-Rekursion und der Stack läuft über. Ich habe den Code nicht vollständig nachvollzogen, aber ich habe die privaten "init"-Methoden in Deiner Klasse UICreateEvent in Verdacht. Der Code in dieser Klasse ist leider nicht nur schlecht lesbar, sondern so auch sehr fehleranfällig. Ich meine die Methodenaufrufe in den diversen adds. Da könnt ich mir vorstellen, dass die sich irgendwie gegenseitig kreuzweise aufrufen.

Ich schlage darum vor, Du schreibst die Klasse nach folgendem Muster um (am Beispiel des mainPanel):
[Java]
public class UICreateEvent{
//... hier die ganzen Buttons etc. ...//
private final JPanel mainPanel;

public UICreateEvent() {
//... hier die initMethoden für die anderen Elemente aufrufen ...//
this.mainPanel= initMainPanel(/*hier die ganzen Panels als Parameter*/);
}

/* Etwas zu viele Methodenparameter, also noch nicht ideal aber schon mal ein Anfang für ein Refactoring */
private static final JPanel initMainPanel(final JPanlel topPanel, final JPanlel kindOfPanel, final JPanlel startPanel,final JPanlel endPanel, final JPanlel loopPanel, final JPanlel buttonsPanel) {
final JPanel result = new JPanel();
result .setLayout(new GridLayout(0, 1));
result.add(topPanel);
result.add(kindOfPanel);
result.add(startPanel);
result.add(endPanel);
result.add(loopPanel);
result.add(buttonsPanel);
return result ;
}
}
[/Java]
 
Zuletzt bearbeitet von einem Moderator:
Danke dir, der Tipp mit der Endlos-Rekursion hat mir geholfen....
war ein eigentlich sehr dummer Fehler aber das passiert wenn man
schnell sein will, schau dir das hier an:

[Java]
public void stateChanged(ChangeEvent e){
JSpinner spinner = (JSpinner)e.getSource();
SpinnerNumberModel model = (SpinnerNumberModel)spinner.getModel();
if(spinner.getValue().equals(model.getMinimum())){
spinner.setValue(model.getMaximum());
}else if(spinner.getValue().equals(model.getMaximum())){
spinner.setValue(model.getMinimum());
}
}
[/code]
Diese Methode wird so immer wieder aufgerufen, und der JSpinner die ganze
Zeit vom Maximum zum Minimum und umgekehrt gesetzt.

Doofe Sache aber dank dem Tipp gelöst 😉
 
Diese Methode wird so immer wieder aufgerufen, und der JSpinner die ganze
Zeit vom Maximum zum Minimum und umgekehrt gesetzt.

Damit hätte ich in dem anderen Thread schon rechnen müssen 😳 Wie hast du's jetzt gemacht? Ein Flag wie
Code:
boolean binGeradeAmSetzen = false;
void change()
{
    if (binGeradeAmSetzen) return;
    binGeradeAmSetzen = true;
    // set min/max value here...
    binGeradeAmSetzen = false;
}
?!
 

Zurück
Oben