JTabbedPane/JDesktopPane komisches verhalten

X

xoom4

Ich habe ein JTabbedPane in einem Frame. Der Frame hat ein MenuBar das beim drücken von Ctrl + N ein neuen Tab erstellen soll. Die Tabs haben alle ein JPanel welches ein BorderLayout inne hat. Inerhalb des BorderLayout wird ein JDesktopPane im BorderLayout.CENTER platziert. Dabei gibt es nur ein JDesktopPane das beim wechsel der Tabs von einem Tab zum anderen verschoben werden soll und zwar mittels der Methode remove und add. Zum anfang mal hier das Stückchen Code in Scala, sollte aber für Java coder leicht verständlich sein:

Code:
class MyTabbedPane extends javax.swing.JTabbedPane {

  var index = 0
  var desktop = new javax.swing.JDesktopPane
  var panels = scala.collection.mutable.Buffer[javax.swing.JPanel]()

  def newTab {

    if(index > 0) // Wenn zweites Tab, entferne JDesktopPane vom ersten Tab
      panels(index - 1).remove(desktop)

    // Hier wird das JDesktopPane hinzugefügt bzw. verschoben.
    panels += new javax.swing.JPanel(new java.awt.BorderLayout) {
      add(desktop, java.awt.BorderLayout.CENTER)
    }

    insertTab("Tab " + (index + 1), null, panels(index), "", index)

    var frame = new javax.swing.JInternalFrame("IFenster " + (index + 1), true, true, true)
    desktop.add(frame)
    frame.show
    frame.setBounds(0 * index, 0, 200, 200)
    frame.setMaximum(true) // <- Diese Methode macht probleme.

    index += 1
  }
}

Ich teste ausschliesslich 2 JInternalFrames, also zweimal Ctrl + N drücken und muss feststellen, dass das erste JInternalFrame nicht angezeigt wird. Das passiert übrigens nur wenn ich ganz schnell Ctrl + N drücke, wenn ich es langsam drücke werden beide JInternalFrames angezeigt. Oder wenn ich frame.setMaximum(true) entferne werden auch beim schnell Ctrl + N drücken beide JInternalFrames angezeigt.

Ich finde das ganze sehr merkwürdig und weiss nicht mehr weiter :confused:
 
Zuletzt bearbeitet von einem Moderator:
X

xoom4

Ich habe eine mögliche Lösunge gefunden indem nach der verschiebung des JDesktopPane auf alle JInternalFrames ein firePropertyChange durchführt wird:
Code:
...
  add(desktop, java.awt.BorderLayout.CENTER)
}

val frames = desktop.getAllFrames
var i = frames.size
while(i > 0) {
  i -= 1
  if(iframes(i).isMaximum) {
    val normalBounds = frames(i).getNormalBounds
    frames(i).firePropertyChange(javax.swing.JInternalFrame.IS_MAXIMUM_PROPERTY, false, true)
    frames(i).setNormalBounds(normalBounds)
  }
}...
Danach verschwinden keine JInternalFrames mehr. Warum das so ist weiss ich nicht, scheint irgendwie ein Problem mit dem maximum zu sein. Beim obigen Code wird übrigens extra rückwärts gezählt damit die Z-Order beibehalten wird.