java.lang.StackOverflowError und find den Fehler nicht

Romsl

Erfahrenes Mitglied
Hi, ich bekomm immer mal wieder eine StackOverflowException und weiß nicht wieso. Habs mit dem Debugger versucht und find den Fehler auch nicht.

Code:
/**
	 * Add mouse listener to popup menu.
	 */
	public void addPopupMenuMouseListener() {
		if (true) {
//Add mouse listener to open popup menu
			this.tree.addMouseListener(new MouseAdapter() {

				public void mouseReleased(MouseEvent e) {
					if (e.getButton() == e.BUTTON3) {
						if (e.isPopupTrigger()) {
							popupMenu.show(e.getComponent(), e.getX(), e.getY());
						}
					}
				}

				public void mousePressed(MouseEvent e) {
					TreePath selectPath = tree.getPathForLocation(e.getX(), e.getY());
					int selectRow = tree.getRowForLocation(e.getX(), e.getY());

					if (changeDate != null || delete != null) {
						popupMenu.removeAll();
						try {
							popupMenuInit();
						}
						catch (Exception ex) {
							ex.printStackTrace();
						}
					}

					if (e.getButton() == e.BUTTON1 && tree.getSelectionPath() == selectPath ||
							e.getButton() == e.BUTTON3) {
						setButtonsEnabled(false, false, true, true, true, false, false);
						tree.setSelectionRow(selectRow);

						if (selectRow != -1) {
							Object[] path = selectPath.getPath();
							String leafPath = String.valueOf(path[path.length - 1]);
							try {
								id = Integer.parseInt(leafPath.substring(leafPath.length() - 6, leafPath.length()));
							}
							catch (NumberFormatException nfe) {
								//do nothing -> only catch exception
							}
							catch (StringIndexOutOfBoundsException sioobe) {
								//do nothing -> only catch exception
							}

							//Reservation special popup menu item
							if (leafPath.indexOf("ReID") != -1) {
								delete = new JMenuItem("Reservierung löschen");
								delete.setIcon(new ImageIcon(ProjectTreeGUI.class.getResource("images/delete.gif")));

								//Add action listener to delete popup menu item
								delete.addActionListener(new ActionAdapter() {
									public void actionPerformed(ActionEvent e) {
										int act = JOptionPane.showConfirmDialog(daps, "Wollen Sie die Reservierung löschen?",
												"Reservierung löschen", JOptionPane.OK_CANCEL_OPTION);
										if (act == JOptionPane.OK_OPTION) {
											if (reservation.deleteReservation(id)) {
												projectTreeGUI.setNewCalculatedTree();
											}
										}
									}
								});

								changeDate = new JMenuItem("Datum der Reservierung ändern");

								//Add action listener to changeDate popup menu item
								changeDate.addActionListener(new ActionAdapter() {
									public void actionPerformed(ActionEvent e) {
										ChangeEntryDateGUI changeEntryDateGUI = new ChangeEntryDateGUI(daps, projectTreeGUI,
												reservation, id);

										int x = (daps.desktopPane.getWidth() / 2) - (changeEntryDateGUI.getWidth() / 2);
										int y = (daps.desktopPane.getHeight() / 2) - (changeEntryDateGUI.getHeight() / 2);

										daps.desktopPane.add(changeEntryDateGUI);
										daps.desktopManager.dragFrame(changeEntryDateGUI, x, y);
										daps.desktopManager.activateFrame(changeEntryDateGUI);
									}
								});

								//Assemble popup menu
								popupMenu.addSeparator();
								popupMenu.add(delete);
								popupMenu.addSeparator();
								popupMenu.add(changeDate);
							}
}
					}
				}
				});
				test = false;
			}
		}

Bin dankbar für jede Hilfe
 
Original geschrieben von Romsl
Hi, ich bekomm immer mal wieder eine StackOverflowException und weiß nicht wieso. Habs mit dem Debugger versucht und find den Fehler auch nicht.

Bin dankbar für jede Hilfe

- StackOverflow deutet auf eine Endlosschleife hin
- Ich weiss nicht, ob eine Reaktion auf mousePressed einwandfrei funktioniert. Wir benutzen immer mouseClicked oder mouseReleased
 
Hallo!

Eine StackOverflowException lässt im Allgemeinen nicht auf eine Endlosschleife schließen sondern eher auf eine endlose Rekursion bzw.eine zu große Rekursionstiefe...
wahrscheinlich wird einer deiner Listener zu oft ausgelöst was wiederum andere Komponenten beinflusst... gibt doch bitte mal ein minimales Beispiel an welches das Problem reproduziert.

Gruß Tom
 
Hi,

ich glaub ich hab den Fehler.
Kann es sein wenn ich mit dem new Operator in der mousePressed, mouseReleased,... oder ... immer neue Objecte erzeuge es zu einem solchen StackOverflow kommt?

Wenn ja, gibt es die Möglichkeit ein JTree Object so zu löschen dass alle Kindknoten weg sind?

Danke für eure Hilfe
 
>ich glaub ich hab den Fehler.
>Kann es sein wenn ich mit dem new Operator in der mousePressed, mouseReleased,... oder ... immer neue Objecte erzeuge es zu einem solchen StackOverflow kommt?

Klingt sehr danach. Die MouseEvents werden eh recht oft aufgerufen, wenn Du Dir mal die SwingEvents anschaust.

>Wenn ja, gibt es die Möglichkeit ein JTree Object so zu löschen dass alle Kindknoten weg sind?
>Danke für eure Hilfe

K.a., hab noch nie was mit Trees gemacht. Schon in die API geschaut?
 
Hallo!

Schau mal hier:

Code:
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreePath;

public class JTreeExample extends JFrame {

	private JScrollPane scrollPane;

	private JTree tree;

	private JButton btnRemove;

	public JTreeExample() {
		super("JTreeExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		tree = new JTree();
		scrollPane = new JScrollPane(tree);
		btnRemove = new JButton("Remove");
		btnRemove.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent evt) {
				TreePath path = tree.getSelectionPath();
				if (path == null)
					return;
				System.out.println(path);
				MutableTreeNode node = (MutableTreeNode) path
						.getLastPathComponent();
				node.removeFromParent();
				tree.updateUI();
			}
		});

		getContentPane().add(scrollPane, BorderLayout.CENTER);
		getContentPane().add(btnRemove, BorderLayout.SOUTH);

		pack();
		setVisible(true);
	}

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

Gruß Tom
 
Zurück