Swing JInternalFrame: Mehrere Probleme

Status
Nicht offen für weitere Antworten.

Souljumper

Aktives Mitglied
hi,

ich hab ein paar Probleme mit der Verwendung von JInternalFrames. Hab ein JFrame das als haupt panel eine JDesktopPane verwendet.

Dieser JDesktopPane füge ich alle Elemente hinzu u.a. auch das JInternalFrame. Das soll jedesmal dann geöffent werden wenn ein Button geklickt wird.

Nun hab ich das Problem, das bei jdem öffnen des InternalFrame dieser immer minimiert hochkommt, obwohl die die größe mit setSize/setPrefferedSize gesetzt hab.
Die JDesktopPane selber hat selber auch Elemetnte (Buttons, label, textfields) die mit einem GridBagLayout angehordnet sind. Wenn ich den internalFrame öffne zerschießt sich das layout der desktoppane, whrend das internalframe sichtbar ist. sobald es wieder geschloßen ist, siht das layout der desktoppane wieder normal aus.

jemand eine idee woran das liegen kann?
 
Ein JDesktopPane sollte eigentlich kein (eigenes, spezielles) Layout und keine Componenten haben - pack' die Lieber in ein JPanel, das passend platziert wird. Wenn diese Components trotzdem unbedingt irgendwie auf dem JDesktopPane untergebracht werden sollen ... muss man mal schauen, ob man da irgendwas dengeln kann... 🙄
 
Ich kann mich meinem Vorredner nur anschließen. Das GridBagLayout möchte nunmal alle Komponenten einschließlich JInternalFrame auslegen.

Du könntest ein JLayeredPane benutzen. In den Hintergrund legst Du ein JPanel mit GridBagLayout. Diesem spendierst Du alle besonderen Komponenten. In den Vordergrund des JLayeredPane legst Du das JDesktopPane (durchsichtig). Dieses bekommt keinen LayoutManager zugewiesen und trägt das JInternalFrame.

Nicht, dass ich das eben ausprobiert hätte, aber so sollte es gehen.

Ebenius
 
Nicht, dass ich das eben ausprobiert hätte, aber so sollte es gehen.
Jetzt hab ich's probiert. So funktioniert's beispielsweise:
Java:
/* build back panel */
final JLabel backLabel = new JLabel("Ebenius");
backLabel.setIcon(new ImageIcon(new URL(
      "http://www.java-forum.org/avatars/ebenius.gif")));
backLabel.setAlignmentX(1.0f);
backLabel.setHorizontalTextPosition(SwingConstants.CENTER);
backLabel.setVerticalTextPosition(SwingConstants.BOTTOM);

final JPanel backPanel = new JPanel(new BorderLayout());
backPanel.setBackground(Color.WHITE);
backPanel.setLayout(new BoxLayout(backPanel, BoxLayout.Y_AXIS));
backPanel.add(Box.createGlue());
backPanel.add(backLabel);

/* build desktop pane */
final JDesktopPane desktopPane = new JDesktopPane();
desktopPane.setOpaque(false);

/* combine desktop pane and back panel */
final JLayeredPane layeredPane = new JLayeredPane();
layeredPane.setLayout(new OverlayLayout(layeredPane));
layeredPane.add(backPanel, JLayeredPane.FRAME_CONTENT_LAYER);
layeredPane.add(desktopPane, JLayeredPane.DEFAULT_LAYER);
layeredPane.setOpaque(true);
layeredPane.setBackground(Color.BLACK);
layeredPane.setPreferredSize(new Dimension(400, 400));

/* build internal frame actions */
final Action clearFramesAction = new AbstractAction("Remove All Frames") {

  public void actionPerformed(ActionEvent e) {
    desktopPane.removeAll();
    desktopPane.revalidate();
    desktopPane.repaint();
  }
};

final Action addFrameAction = new AbstractAction("Add Frame") {

  int frameNumber = 0;

  public void actionPerformed(ActionEvent e) {
    final JInternalFrame internalFrame = new JInternalFrame("Internal");
    internalFrame.setContentPane(new JLabel("Test Frame: "
          + (frameNumber + 1)));
    internalFrame.pack();
    internalFrame.setLocation(frameNumber * 20, frameNumber * 20);
    frameNumber++;
    desktopPane.add(internalFrame);
    internalFrame.setVisible(true);
  }
};

/* build button panel */
final JButton addButton = new JButton(addFrameAction);
addButton.setAlignmentX(0.5f);
final JButton removeButton = new JButton(clearFramesAction);
removeButton.setAlignmentX(0.5f);

final JPanel buttonPanel = new JPanel(null);
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
buttonPanel.add(Box.createVerticalGlue());
buttonPanel.add(addButton);
buttonPanel.add(Box.createVerticalStrut(6));
buttonPanel.add(removeButton);
buttonPanel.add(Box.createVerticalGlue());

/* build content pane */
final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
contentPane.add(layeredPane, BorderLayout.CENTER);
contentPane.add(buttonPanel, BorderLayout.LINE_END);

/* show test frame */
final JFrame f = new JFrame("Test Frame: LayeredDesktopPaneTestGUI");
f.setContentPane(contentPane);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
Ebenius
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben