Fehler beim erneuten Öffnen von JInternalFrame

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo zusammen,

ich habe folgende Probleme:

1.) Wenn ich in meinem JFrame ein JInternalFrame geöffnet habe und über die Optionen es erneut öffnen will, obwohl das Fenster bereits offen ist, erhalte ich folgenden Fehler:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: illegal component position
	at java.awt.Container.addImpl(Unknown Source)
	at javax.swing.JLayeredPane.addImpl(Unknown Source)
	at javax.swing.JDesktopPane.addImpl(Unknown Source)
	at java.awt.Container.add(Unknown Source)

Wieso ist es dem Benutzer nicht gestattet das Fenster erneut zu öffnen? Ich finde dafür keinerlei Erklärung.

2.) Ausgangssituation: Der Benutzer öffnet 2 verschiedene JInternalFrames.
Problem: Wechselt er den Fokus von einem Fenster A zum anderen Fenster B, so erscheint das Fokusfenster B (welches sich unterhalb von A befand) oberhalb von A.

Ich hoffe ihr könnt mir ein solches Verhalten ein wenig näher erläutern.

Vielen Dank im Voraus.
 
zu 1.) zeig mal code
zu 2.) äh ja ... das ist doch völlig normal. Nenn mir auch nur ein (sinnvolles) Beispiel wo es anderst ist ...
 
zu 1.) Aufruf des JInternalFrames per Menü:
Code:
//menuItemZeiterfassung
  private void openFrame()
  { 
    desktopPane.add(myFrame);
    desktopPane.revalidate();
    myFrame.show();  
  }

Größe des Fensters:

Code:
public MainApplication()
  {
    initGUI();
    initListener();
    initMenu();

    setSize(1024, 768);
    setTitle("Hauptapplikation");
    setVisible(true);
  }

Größe des JInternalFrames:
Code:
public void placePanels()
//Einstellungen speziell für JInternalFrame
    pack();
    setSize(new Dimension(1024, 768));
    setPreferredSize(new Dimension(1024, 768));
    setTitle("Zeiterfassung");
    setClosable(true);
    setResizable(true);
    setMaximizable(true);
    setIconifiable(true);
    setVisible(true);
  }

Des sollten die relevanten Codeteile sein.

zu 2.) Um es vielleicht einmal kurz zu verdeutlichen:

Positionen vor dem Fokuswechsel:

___________________________________________________
| JDesktopPane |
| |
| ____________ |
| | A | |
| |___________ | |
| |
| ____________ |
| | B | |
|___________|___________|___________________________|

Position nach dem Fokuswechsel:
___________________________________________________
| |
| JDesktopPane |
| |
| ____________ |
| | B | |
| |___________ | |
| |
| ____________ |
| | A | |
|___________|___________|___________________________|

Die Fenster werden komplett in ihrer Position vertauscht. Es ist nicht so, dass sie kaskadierend zu einander positioniert sind.
Da ich ein Beispiel nennen sollte, wo das nicht so ist, so nen ich einfach mal Windows, wo die Fenster, wenn sie ihren Fokus verlieren, nicht die Position vertauschen;-).
 
achso. Dann hab ich dein 2. falsch Verstanden. Das Verhalten ist unnormal und konnte ich auch so noch nicht beobachten. Am Besten baust du mal ein KSKB (kleines, ausführbares Beispiel, welches uns dein Problem zeigt).
 
KSKB:

Code:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

//JFrame-Version
public class WindowSwing extends JFrame{

  private static final long serialVersionUID = 5259700796854880162L;
  //DesktopPane wird für die Darstellung eines InternalFrames benötigt
  JDesktopPane desktopPane = new JDesktopPane();
  // Anzahl der Fenster
  int windowCount = 1;
  public WindowSwing()
  {
    //Größe des Fensters
    setSize(1024, 768);
    addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e) {
      System.exit(0);
      }
    });

//  Container der Objekte
    Container contentPane = getContentPane();
        
    //JDesktopPane hat standardmäßig einen null-LayoutManager
    desktopPane.setLayout(new FlowLayout());
    
    //Neue Menüzeile
    JMenuBar menuBar1 = new JMenuBar();
    //Neue Menüspalte
    JMenu menuMenu= new JMenu();
    
    JMenuItem fensterOeffnen = new JMenuItem();
    menuMenu.setText("Menü");
        menuMenu.setName("Men\u00fc");
        
        fensterOeffnen.setActionCommand("Fenster öffnen");
        fensterOeffnen.setText("Fenster öffnen");
        fensterOeffnen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
//               false: Größe nicht veränderbar, true: Schließen möglich, true: Maximieren möglich, true: Symboldarstellung möglich
        JInternalFrame jif = new JInternalFrame("Fenster " + windowCount++, false, true, true, true);
        //Größe des Internal Frame
        jif.setPreferredSize(new Dimension(800, 600));
        //Hinzufügen des Internal Frames dem DesktopPane
        desktopPane.add(jif);
        //Container mit neuem Inhalt wird neu dargestellt
        desktopPane.revalidate();
        jif.show();
            }
        });

        menuMenu.add(fensterOeffnen);
        menuBar1.add(menuMenu);
        menuMenu.getAccessibleContext().setAccessibleName("Menu");

        setJMenuBar(menuBar1);
        setVisible(true);
        
        contentPane.add(desktopPane, BorderLayout.CENTER);
  }
  
  public static void main(String[] args) {
    WindowSwing testwindow = new WindowSwing();
    
  }

}

Vorgehensweise:
1.) Fenster 1 wird geöffnet und wird oben zentriert dargestellt.
2.) Fenster 2 wird geöffnet und übernimmt die Position von Fenster 1. Fenster 2 bekommt logischerweise den Fokus. Fenster 1 wird unterhalb von Fenster 2 dargestellt. -> Erster Fehler: Fenster 2 soll unterhalb von Fenster 1 dargestellt werden.
3.) Fenster 1 bekommt nun den Fokus und nimmt die Position von Fenster 2 ein. ->Zweiter Fehler: Die Position soll diesselbe sein.
 
Ok das löst das zweite Problem. Aber hat jemand eine Erklärung wieso das erste Problem auftritt?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben