Seltsames verhalten des Befehles getContentPane().add(.)

Status
Nicht offen für weitere Antworten.

silentwater

Mitglied
ich bin auf ein ganz seltsames verhalten gestoßen,

ich möchte auf der Linken Seite des fensters ein JPanel ein und ausblenden können.
Code:
public class Test {
	
   UserInterface userInterface;
	
   public Test() {
		
    userInterface = new UserInterface();
    userInterface.addWindowListener(new WindowClosingAdapter(userInterface));

		

    userInterface.setShowNetwork(true);
    //userInterface.setShowNetwork(showNetwork);
    
    userInterface.setSize(100,100);
    userInterface.setLocation(100,100
    userInterface.setVisible(true);		
   }
	
  public void setNetwork() {
    userInterface.setShowNetwork(false);
  }
	
  public static void main(String args[]) {
    Test test = new Test();
    test.setNetwork();
 } 	
}

das wichtigste aus der Klasse UserInterface sieht folgendermaßen aus...
Code:
public class UserInterface 
extends JFrame
implements ActionListener{
	
  boolean showNetwork;
  JPanel westPanel;
  JTabbedPane westTP;
  GmlPanel gmlPanel;
	
  JTextField searchTextField;
	
  public UserInterface() {
		
    super("Visualisierung von GML");
				
    getContentPane().setLayout(new BorderLayout(5, 5));
    JPanel toolbarPanel = new JPanel();
    toolbarPanel.setLayout(new BorderLayout(5, 5));
		
		
    //Toolbar
    JToolBar toolbar = new JToolBar();
    JIconButton iconButton;
   
    //Der Netze Button öffnet oder schließt links ein Panel, auf dem die Netze ausgewählt werden können
    iconButton = new JIconButton("Netze", "network.gif");
    iconButton.addActionListener(this);
    toolbar.add(iconButton);
		
    toolbarPanel.add( toolbar, BorderLayout.NORTH );
   //.. hier habe ich jetzt jede Menge weggelassen was für das Problem nicht relevant ist		
    getContentPane().add( toolbarPanel, BorderLayout.NORTH);	
		
		
    westPanel = new JPanel();
    westPanel.setBorder(new BevelBorder(BevelBorder.RAISED));
    westTP = new JTabbedPane();
	
    panel = new JPanel();
    panel.setLayout(new GridLayout(3,2));
    JCheckBox cb1 = new JCheckBox( "PKW", true );
    panel.add(cb1);
    cb1 = new JCheckBox( "Bus", true );
    panel.add(cb1);
    cb1 = new JCheckBox( "Eisenbahn", true );
    panel.add(cb1);
    cb1 = new JCheckBox( "U-Bahn", true );
    panel.add(cb1);
    cb1 = new JCheckBox( "Flugzeug", true );
    
    panel.add(cb1);
    westTP.addTab("Verkehrsmittel", panel);
		
    panel = new JPanel();
    westTP.addTab("Bezirke", panel);
		
    panel = new JPanel();
    panel.setLayout(new GridLayout(3,2));
    westTP.addTab("Rasterbilder", panel);
    cb1 = new JCheckBox( "Niederschläge", true );
    panel.add(cb1);
    cb1 = new JCheckBox( "Satelitenbild", true );
    panel.add(cb1);
				
    westPanel.add(westTP);
		
    gmlPanel = new GmlPanel();
    getContentPane().add( gmlPanel, BorderLayout.CENTER);	
  }
	
  public void setShowNetwork(boolean showNetwork){
    this.showNetwork = showNetwork;
    if(showNetwork == true) {
      getContentPane().add( westPanel, BorderLayout.WEST);
      getContentPane().doLayout();
    }
    else { 
      getContentPane().remove(westPanel);
      getContentPane().doLayout();
    }
  }
	
  public void actionPerformed(ActionEvent event) {		
    if(event.getActionCommand()=="Netze") {
      setShowNetwork(!showNetwork);
    }
}

das seltsame dabei ist, sobald ich im Konstrukutor der Klasse test die Funtkion userInterface.setShowNetwork(true) nicht aufrufe, wird zwar das westPanel nach drücken des Buttons "Netze" gezeichnet, aber leer. Auch wenn ich nach der genannten Funktion den Aufruf userInterface.setShowNetwork(false) aufrufen würde, würde das Panel westPanel immer leer gezeichnet werden.
Wenn ich jedoch userInterface.setShowNetwork(false) außerhalb des Konstruktors von test aufrufe, in meinem Code also in der Funtkion test.setNetwork(), dann wird das westPanel samt innhalt gezeichnet (wenn ich auf den Button Netze klicke), aber nur wenn im Konstruktor von Test eben der befehl userInterface.setShowNetwork(true) aufgerufen wurde.
Aber westPanel ist doch eine Klassenvariable. Warum werden die Elemente die ich diesem Panel hinzugefügt habe nur in manchen Fällen übernommen?
 

silentwater

Mitglied
hmmm, ich habe Eclipse geschlossen und neu gestartet, dann hat es ganau einmal funktioniert ....... seltsam. Aber es ist nicht immer so, manchmal funktioniert es genau einmal nach einem neustart, manchmal überhaupt nicht.......

EDIT: das lag an was anderes, das im ersten Post geschilderte Problem ist immer noch da..........
 

MPW

Top Contributor
Also,

erstens, geht es denn außerhalb von Eclipse? Kompilier's mal und starte es über java DeineMainKlasse aus dem Verzeichnis...

Ich benutze kein Ecplise....deswegen kann ich dir da nichts genaueres sagen...du redest aber schon von einem Problem mit deinem Javaprogramm, nciht von einem Bug in Eclipse, oder?

Ich hab' jetzt oben nicht genau geguckt, aber kann es sein das das ein Swing-ist-nicht-Threadsicher-Problem ist? D.h., das direkt danach wieder ein Befehl ausgeführt wird und der Swingthread nicht genug Zeit hat das Panel zu zeichnen? Das kannst du mit einer AWTEventQueue lösen.

//edit: hab' gerade mal versucht das mit deinem Quelltext zu testen..er ist jedoch nicht vollständig...
 

silentwater

Mitglied
MPW hat gesagt.:
Ich hab' jetzt oben nicht genau geguckt, aber kann es sein das das ein Swing-ist-nicht-Threadsicher-Problem ist? D.h., das direkt danach wieder ein Befehl ausgeführt wird und der Swingthread nicht genug Zeit hat das Panel zu zeichnen? Das kannst du mit einer AWTEventQueue lösen

Ja, nach genau so was sieht es aus. Wie funktioniert das prinzipiell mit der AWTEventQueue?

Es liegt auch nicht an Eclipse. Das war eine Fehleinschätzng, leider konnte ich den Post nicht löschen, deswegen steht er immer noch drinnen.

Ja, der Code ist nicht vollständig. Ich habe versucht nur die relevanten Teile zu posten, da der gesamte Code viel größer ist. Das meiste sind aber nur panels,buttons, menüs etc zu erstellen......
 
M

MPW-al.-Gast-weilzuFauzuL

Gast
zur AWTEventqueue musst du mal hier suchen, ich hab' das schonmal gepostet, hab jetzt kein Bock das nochmal zu machen, ansonsten in Java-ist-auch-eine-Insel gucken....
 

silentwater

Mitglied
So wie ich das verstanden habe können Probleme bei der Verwendung eigener Threads auftreten, ich verwende aber keine Threads (auser dem Swing Thread der vom System erzeugt wird). Ist das korrekt, oder kann die Thread-Unsicherheit von Swing auch Fehler versursachen, wenn keine eigenen Threads erzeugt werden?

Mir ist noch folgendes bei meinem Problem aufgefallen:

Code:
   userInterface = new UserInterface();

    userInterface.setShowNetwork(true);

    userInterface.setSize(x_dimension,y_dimension);
    userInterface.setLocation(x_position, y_position);
    userInterface.setVisible(true);
Der Befehl "userInterface.setShowNetwork(true);" zeigt das Panel an, das ich gerne ein uns ausblenden können würde. Solange dieser Befehl vor "userInterface.setVisible(true);" steht, kann das Panel korrekt angezeigt und ausgeblendet werden. Wenn ich diesen Befehl aber erst nach setVisible(true) setzte, also
Code:
   userInterface = new UserInterface();

    userInterface.setSize(x_dimension,y_dimension);
    userInterface.setLocation(x_position, y_position);
    userInterface.setVisible(true);

    userInterface.setShowNetwork(true);
dann wird immer ein leeres Panel gezeichnet. Da mein Programm beim starten das Panel nicht zeichnen soll, muß ich momentan das Panel erst hinzufügen und gleich wieder entfernen, damit es danach korrekt funktioniert. Das ist jedoch extrem unschön.

der Befehl "userInterface.setShowNetwork(true);" und der Konstruktor von "userInterafce" habe ich im ersten Post ja schon geschrieben.

Hängt das mit der Thread Unsicherheit zusammen?
 
M

MariusL

Gast
Das Problem könnte tatsächlich mit der Threadunsicherheit von Swing zutun haben. Ich hatte ein etwas ähnliches bei mir beobachten können und als ich dann die Unterprogramm aufrufe in

Code:
...
EventQueue.invokeLater(new Runnable(){
   public void run(){
	....
   }
});
...

verpackt habe funktionierte alles einwandfrei; denn nun wartet das Programm, wie es sich gehört, bis die Unterprgramme nacheinander abgearbeitet wurden.

Vielleicht hilft's Dir.
Gruß,
Marius
 

silentwater

Mitglied
Mit
Code:
EventQueue.invokeLater
habe ich einen Null Pointer Exception bekommen.

Exception in thread "main" java.lang.NullPointerException
at Test.<init>(Test.java:21)
at Test.main(Test.java:86)

meine Klasse sieht nun folgendermaßen aus
Code:
import java.awt.EventQueue;
import java.lang.reflect.InvocationTargetException;

import org.w3c.dom.*;

import javax.xml.parsers.*;



public class Test {
	
	UserInterface userInterface;
	
	public Test() throws InterruptedException, InvocationTargetException {
		
		EventQueue.invokeLater(new Runnable(){ 
		   public void run(){ 
		     userInterface = new UserInterface();
		   } 
		});
		userInterface.addWindowListener(new WindowClosingAdapter(userInterface));

		
		//xml Datei einlesen
		try {
    DocumentBuilderFactory factory  = DocumentBuilderFactory.newInstance();
    DocumentBuilder        builder  = factory.newDocumentBuilder();
    Document  document = builder.parse("src/preference.xml");
    
    NodeList ndList = document.getElementsByTagName("x_position");
    Node node = ndList.item(0).getFirstChild();
    String nodeValue = node.getNodeValue();
    nodeValue = nodeValue.replace("\n","");
    nodeValue = nodeValue.replace(" ","");
    int x_position = Integer.parseInt(nodeValue);

    ndList = document.getElementsByTagName("y_position");
    node = ndList.item(0).getFirstChild();
    nodeValue = node.getNodeValue();
    nodeValue = nodeValue.replace("\n","");
    nodeValue = nodeValue.replace(" ","");
    int y_position = Integer.parseInt(nodeValue);
  
    ndList = document.getElementsByTagName("x_dimension");
    node = ndList.item(0).getFirstChild();
    nodeValue = node.getNodeValue();
    nodeValue = nodeValue.replace("\n","");
    nodeValue = nodeValue.replace(" ","");
    int x_dimension = Integer.parseInt(nodeValue);
    
    ndList = document.getElementsByTagName("y_dimension");
    node = ndList.item(0).getFirstChild();
    nodeValue = node.getNodeValue();
    nodeValue = nodeValue.replace("\n","");
    nodeValue = nodeValue.replace(" ","");
    int y_dimension = Integer.parseInt(nodeValue);
    
    ndList = document.getElementsByTagName("showNetwork");
    node = ndList.item(0).getFirstChild();
    nodeValue = node.getNodeValue();
    nodeValue = nodeValue.replace("\n","");
    nodeValue = nodeValue.replace(" ","");
    boolean showNetwork = Boolean.parseBoolean(nodeValue);
    //wenn der folgende Befehl erst nach setVisible(true) kommt,
    //wird nur noch ein leeres Panel angezeigt
    //userInterface.setShowNetwork(true);
    //userInterface.setShowNetwork(showNetwork);
    
    userInterface.setSize(x_dimension,y_dimension);
    userInterface.setLocation(x_position, y_position);
    userInterface.setVisible(true);
    
    //userInterface.setShowNetwork(true);
		}
		catch(Exception e) {
			
		}
		
	}
	
	public void setNetwork() {
		userInterface.setShowNetwork(false);
	}
	
	public static void main(String args[]) throws InterruptedException, InvocationTargetException {
		Test test = new Test();
		test.setNetwork();
	}
	
	
}
wobei das interessante dabei ist, daß wenn ich meinen Code durch den Debuger schicke, dann bekomme ich dort keinen Fehler.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Hatsi09 JavaFx Mediaplayer seltsames Verhalten AWT, Swing, JavaFX & SWT 0
HarleyDavidson Swing Seltsames Verhalten GridBagLayout AWT, Swing, JavaFX & SWT 11
P JFrame langsam / seltsames Verhalten AWT, Swing, JavaFX & SWT 6
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
D Seltsames Verhalten meiner CheckBoxen AWT, Swing, JavaFX & SWT 7
dzim [SWT] Seltsames verhalten bei TableViewer mit TextCellEditor AWT, Swing, JavaFX & SWT 5
G Seltsames Verhalten JButton AWT, Swing, JavaFX & SWT 6
M Seltsames Verhalten Tooltip und JDialog AWT, Swing, JavaFX & SWT 8
M Seltsames Problem mit Resize eines Fensters und seiner Komponenten AWT, Swing, JavaFX & SWT 2
O Seltsames Scroll-Problem AWT, Swing, JavaFX & SWT 7
S Seltsames Problem - manchmal enthaelt die ActionMap eine JTextArea keine Actions. AWT, Swing, JavaFX & SWT 4
K seltsames problem AWT, Swing, JavaFX & SWT 2
I Seltsames Problem mit JLabel AWT, Swing, JavaFX & SWT 4
G Seltsames Phänomen beim starten meiner Applikation AWT, Swing, JavaFX & SWT 8
R JDialog hat seltsames Design AWT, Swing, JavaFX & SWT 6
Juelin Komisches Verhalten des JavaFXprogrammes AWT, Swing, JavaFX & SWT 4
T JavaFX JFrame verhalten wie JOptionPane (ErrorMessage) AWT, Swing, JavaFX & SWT 1
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
pkm kryptisches Verhalten bei GridLayout AWT, Swing, JavaFX & SWT 4
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
D Merkwürdiges Verhalten vom JMenu AWT, Swing, JavaFX & SWT 4
T JavaFX Verhalten ImageView bei grossen BIlddateien AWT, Swing, JavaFX & SWT 0
R Ändern Default-Verhalten von JScrollpane in einer JScrollpane AWT, Swing, JavaFX & SWT 1
S JTabbedProblem - "komisches" Verhalten AWT, Swing, JavaFX & SWT 2
T Wie ist das "Lookup-Verhalten" von JList, JCombobox änderbar? AWT, Swing, JavaFX & SWT 4
N Swing Dynamisches Verhalten bei Änderung Fenstergröße AWT, Swing, JavaFX & SWT 6
E Swing Fehlerhaftes Verhalten bei gleichzeitigen Verwendnen von PopUpMenu und JDialog?! AWT, Swing, JavaFX & SWT 5
Ollek JTextField Verhalten mit LayoutManager AWT, Swing, JavaFX & SWT 8
E Swing Maskformatter Verhalten?! AWT, Swing, JavaFX & SWT 5
A JTreeTable - unerklärliches Verhalten von getValueAt AWT, Swing, JavaFX & SWT 2
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
hdi SWT Shell: Auslagerung von Code verändert Verhalten AWT, Swing, JavaFX & SWT 6
U Verhalten des CheckBoxCellEditors AWT, Swing, JavaFX & SWT 3
H2SO3- AWT seltsammes verhalten eines Panels AWT, Swing, JavaFX & SWT 9
pinerski Swing JList merkwürdiges Verhalten beim sortieren AWT, Swing, JavaFX & SWT 3
I Hyper-Link ähnliches Verhalten AWT, Swing, JavaFX & SWT 5
L JFrame-Verhalten bei Klick auf Schließen-Kreuz ändern AWT, Swing, JavaFX & SWT 3
R JProgressBar-Verhalten AWT, Swing, JavaFX & SWT 5
J JScrollBar scroll-Verhalten auf 2 JButtons umleiten? AWT, Swing, JavaFX & SWT 2
ARadauer bestimmtes verhalten für jtable AWT, Swing, JavaFX & SWT 6
M Merkwürdiges Verhalten von ListCellRender AWT, Swing, JavaFX & SWT 2
S Wie verhalten sich transparente Grafiken? AWT, Swing, JavaFX & SWT 5
sparrow Tasten mit Umlauten im KeyListener verhalten sich seltsam AWT, Swing, JavaFX & SWT 4
K JList - merkwürdiges Verhalten bei Leertaste (unter Focus) AWT, Swing, JavaFX & SWT 7
M drawImage mit seltsamen verhalten AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben