Swing JInternalFrame und LayoutManager

Status
Nicht offen für weitere Antworten.
Ich nutze JInternalFrame und kleine Fenster innerhalb meines Hauptfensters zu erzeugen.


Mein Hauptfenster, das JDesktopPane enthält, ist mit LayoutManagern in verschiedene Bereiche eingeteilt.
Wenn ich jetzt einen neuen JInternalFrame erzeugen, dann wird dieser nur minimiert dargestelt und lässt sich auch nicht vergrößern. Wenn ich diesen über den Bildschirm schiebe verschwindet er an den Stellen an denen ein List Element angzeigt wird.

Handelt es sich hier um eine Grundsatzproblem in Bezug auf die Verwendung von LayoutManagern oder ist das ein spezifisches Problem wofür ich den ganzen Code posten muss (selber knobeln hat den größeren Lerneffekt).
 
Ja. ListBoxen, JPanels, und nen JButton (obwohl der sich auch entfernen lässt).

Das Prinzip ist folgendes. Der Hintergrund soll ner Art Tafel entsprechen und die JInternalFrames stellen dann die Zettel oder Magneten der Tafel dar, die man dann verschieben kann. Dazu muss ich den Hintergrund natürlich in Segmente einteilen. Außerdem wollte ich die InternalFrames die auf ein bestimmtes Segment geschoben werden auch in einer List daneben anzeigen lassen um die Übersicht zu behalten.

Muss ich dann meinen jetzigen Hintergrund auch als JInternalFrame defninieren der den Bildschirm ausfüllt und nicht verschoben werden kann oder wie gehe ich dann meine Aufgabenstellung an?
 

Michael...

Top Contributor
Wie gesagt JDesktopPane ist nur dafür gedacht JInternalFrames aufzunehmen, weiss garnicht ob die Komponente etwas mit einem Layout anfangen kann.

Wenn die InternalFrames auch Deine anderen Komponenten (Listen, Buttons, ...) überlappen sollen, musst Du Dir wohl was eigenes basteln.
 

Ebenius

Top Contributor
Wenn die InternalFrames auch Deine anderen Komponenten (Listen, Buttons, ...) überlappen sollen, musst Du Dir wohl was eigenes basteln.
JDesktopPane erbt von JLayeredPane und kann genauso mit Layers und Layouts umgehen. Es ist auch mit einem JDesktopPane möglich, zusätzlich andere Komponenten darzustellen.

@TO: Poste mal Quelltext. Hier mal ein Beispiel mit dem sowas funktioniert:
Java:
final JDesktopPane desktopPane = new JDesktopPane();
final BorderLayout borderLayout = new BorderLayout(6, 6);
desktopPane.setLayout(borderLayout);

/* add components to background */
desktopPane.add(new JButton("SOUTH"), BorderLayout.SOUTH);
desktopPane.add(new JButton("NORTH"), BorderLayout.NORTH);
desktopPane.add(new JButton("EAST"), BorderLayout.EAST);
desktopPane.add(new JButton("WEST"), BorderLayout.WEST);
for (final Component c : desktopPane.getComponents()) {
  desktopPane.setLayer(c, Integer.MIN_VALUE);
}

/* add internal frames*/
final JInternalFrame internalFrame = new JInternalFrame("Frame");
internalFrame.getContentPane().add(new JScrollPane(new JTable(10, 2)));
internalFrame.pack();
internalFrame.setVisible(true);
desktopPane.add(internalFrame);
borderLayout.removeLayoutComponent(internalFrame);

final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
contentPane.add(desktopPane);

final JFrame f = new JFrame("Test Frame: JDesktopPaneFun"); //$NON-NLS-1$
f.setContentPane(contentPane);
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
Ebenius
 
danke deine Version funktioniert. Jedoch funktioniert das nicht mit einem GridBagLayout. Habe dein Beispiel mal auf meine Anforderungen angeändert. Sobald ich das GridBagLayout verwende um den Hintergrund einzuteilen, lässt sich der JInternalFrame nicht mer in der Größe verändern. Dabei habe ich im Konstruktur den Paramter Resizable auf true gestellt.

Java:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class desk {

  private JPanel blau = new JPanel();
  private JPanel dunkelgruen = new JPanel();
  private JPanel hellgruen = new JPanel();
  
  private JLabel laBlau = new JLabel("blau");
  private JLabel laDunkelgruen = new JLabel("dunkelgrün");
  private JLabel laHellgruen = new JLabel("hellgrün");


  
public desk() {
      final JDesktopPane desktopPane = new JDesktopPane();
      GridBagLayout gridbag = new GridBagLayout();
      GridBagConstraints c = new GridBagConstraints();
      desktopPane.setLayout(gridbag);

    // Label den Farben zuordnen
    blau.add(laBlau);
    dunkelgruen.add(laDunkelgruen);
    hellgruen.add(laHellgruen);

    // Farbe und Größe anpassen

    blau.setBackground(Color.blue);
    dunkelgruen.setBackground(new Color(0,154,90));
    hellgruen.setBackground(new Color(8,231,24));

/* add components to background */

    // Listen für blau, dunkelgrün, hellgrün
    c.insets = new Insets(0, 0, 0, 0);
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    c.weightx = 1.0;
    c.weighty = 1.0;

    // blau, dunkelgrün, hellgrün
    c.gridx = 0; c.gridy = 0;
    gridbag.setConstraints(blau, c);
    desktopPane.add(blau);

    c.gridy = 1;
    gridbag.setConstraints(dunkelgruen, c);
    desktopPane.add(dunkelgruen);

    c.gridy = 2;
    gridbag.setConstraints(hellgruen, c);
    desktopPane.add(hellgruen);
    
for (final Component co : desktopPane.getComponents()) {
  desktopPane.setLayer(co, Integer.MIN_VALUE);
}

/* add internal frames*/
JInternalFrame internalFrame = new JInternalFrame("Frame", true, true);
internalFrame.getContentPane().add(new JScrollPane(new JTable(10, 2)));
internalFrame.pack();
internalFrame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
internalFrame.setVisible(true);
desktopPane.add(internalFrame);
gridbag.removeLayoutComponent(internalFrame);

final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
contentPane.add(desktopPane);

final JFrame f = new JFrame("Test Frame: JDesktopPaneFun"); //$NON-NLS-1$
f.setContentPane(contentPane);
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);

}

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

Ebenius

Top Contributor
Natürlich. Der LayoutManager positioniert die Kinder. Das BorderLayout tut das nur deswegen nicht, weil ich ihm explizit gesagt habe, dass es das lassen sollen; hab ihm die Komponente wieder weggenommen, siehe Zeile 20 oben.

Mach's doch einfach so, dass Dein JDesktopPane ein HintergrundPanel bekommt das alle anderen Komponenten trägt. Dazu nutzt Du einen eigenen LayoutManager:
Java:
public class FullSizeLayout implements LayoutManager2 {

  public static final String IGNORED = "ignored";
  public static final String FULL_SIZE = "ignored";
  private final Collection<Component> components =
        Collections.newSetFromMap(new WeakHashMap<Component, Boolean>());

  public Dimension preferredLayoutSize(Container parent) {
    int w = 0;
    int h = 0;
    final int componentCount = parent.getComponentCount();
    for (int i = 0; i < componentCount; i++) {
      final Component c = parent.getComponent(i);
      final Dimension size = c.getPreferredSize();
      w = Math.max(w, size.width);
      h = Math.max(h, size.height);
    }
    final Insets insets = parent.getInsets();
    return new Dimension(insets.left + insets.right + w, insets.top
          + insets.bottom
          + h);
  }

  public Dimension minimumLayoutSize(Container parent) {
    int w = 0;
    int h = 0;
    final int componentCount = parent.getComponentCount();
    for (int i = 0; i < componentCount; i++) {
      final Component c = parent.getComponent(i);
      final Dimension size = c.getMinimumSize();
      w = Math.max(w, size.width);
      h = Math.max(h, size.height);
    }
    final Insets insets = parent.getInsets();
    return new Dimension(insets.left + insets.right + w, insets.top
          + insets.bottom
          + h);
  }

  public Dimension maximumLayoutSize(Container parent) {
    int w = 0;
    int h = 0;
    final int componentCount = parent.getComponentCount();
    for (int i = 0; i < componentCount; i++) {
      final Component c = parent.getComponent(i);
      final Dimension size = c.getMaximumSize();
      w = Math.max(w, size.width);
      h = Math.max(h, size.height);
    }
    final Insets insets = parent.getInsets();
    return new Dimension(insets.left + insets.right + w, insets.top
          + insets.bottom
          + h);
  }

  public void layoutContainer(Container parent) {
    final Insets insets = parent.getInsets();
    final int x = insets.left;
    final int y = insets.top;
    final int w = parent.getWidth() - insets.left - insets.right;
    final int h = parent.getHeight() - insets.top - insets.bottom;
    final int componentCount = parent.getComponentCount();
    for (int i = 0; i < componentCount; i++) {
      final Component c = parent.getComponent(i);
      if (components.contains(c)) {
        c.setBounds(x, y, w, h);
      }
    }
  }

  public void invalidateLayout(Container target) {}

  public void addLayoutComponent(String name, Component comp) {}

  public void addLayoutComponent(Component comp, Object constraints) {
    if (FULL_SIZE.equals(constraints)) {
      components.add(comp);
    }
  }

  public void removeLayoutComponent(Component comp) {
    components.add(comp);
  }

  public float getLayoutAlignmentX(Container target) {
    return 0.5f;
  }

  public float getLayoutAlignmentY(Container target) {
    return 0.5f;
  }
}
... und baust es etwa so ein:
Java:
final JPanel backgroundPanel = new JPanel(new GridBagLayout());
backgroundPanel.setOpaque(false);
// hier dem backgroundPanel alle Komponenten hinzufügen

desktopPane.setLayout(new FullSizeLayout());
desktopPane.add(backgroundPanel, FullSizeLayout.FULL_SIZE);
desktopPane.setLayer(backgroundPanel, Integer.MIN_VALUE);
Die Internal Frames kannst Du dann ganz einfach wie immer hinzufügen, das Layout wird sie ignorieren.

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T JInternalFrame Konflikt mit LayoutManager AWT, Swing, JavaFX & SWT 5
D JInternalFrame wechselt Position beim ersten Click AWT, Swing, JavaFX & SWT 0
J Mehrere JInternalFrame; GetValues AWT, Swing, JavaFX & SWT 1
L LookAndFeel JInternalFrame aussehen isSelected() true vs false AWT, Swing, JavaFX & SWT 0
X JInternalFrame vor Java2D-Zeichnung langsam bzw. Gui friert ein AWT, Swing, JavaFX & SWT 1
G Swing JInternalFrame AWT, Swing, JavaFX & SWT 0
R Custome TitlePane JInternalFrame - ControlButton AWT, Swing, JavaFX & SWT 2
B JInternalFrame Focus setzten geht nicht AWT, Swing, JavaFX & SWT 2
J Swing JInternalFrame modal setzen? AWT, Swing, JavaFX & SWT 13
J Swing JInternalFrame schließen ändern? AWT, Swing, JavaFX & SWT 7
J Swing Fokus JInternalFrame fehlerhaft AWT, Swing, JavaFX & SWT 4
G JInternalframe geöffnet oder nicht? AWT, Swing, JavaFX & SWT 4
G Swing und MDI mit JInternalFrame AWT, Swing, JavaFX & SWT 11
H Swing JInternalFrame, JDesktopPane und ein BorderLayout AWT, Swing, JavaFX & SWT 2
R Problem beim Anzeigen von Bildern auf JInternalFrame AWT, Swing, JavaFX & SWT 6
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
A Swing getInsets() JInternalFrame AWT, Swing, JavaFX & SWT 2
R Swing JInternalFrame Opaque AWT, Swing, JavaFX & SWT 6
M JInternalFrame - Handhabung? AWT, Swing, JavaFX & SWT 5
algorismi JInternalframe Icon AWT, Swing, JavaFX & SWT 14
S JInternalFrame oder JTextArea neu laden AWT, Swing, JavaFX & SWT 2
V JInternalFrame wird überzeichnet AWT, Swing, JavaFX & SWT 8
T Neuen JInternalFrame von JLabel "herunterziehen" AWT, Swing, JavaFX & SWT 6
T JInternalframe auf DropTarget droppen? AWT, Swing, JavaFX & SWT 7
O Swing JInternalFrame komplett neu laden AWT, Swing, JavaFX & SWT 3
B JInternalFrame - Maximieren AWT, Swing, JavaFX & SWT 11
X Grafikfehler mit JInternalFrame (Überlagerungen) AWT, Swing, JavaFX & SWT 2
B Swing Image als Hintergrund im JInternalFrame - Problem AWT, Swing, JavaFX & SWT 3
J Swing JInternalFrame - mit DesktopManager maximieren AWT, Swing, JavaFX & SWT 3
J Swing JInternalFrame - Bug: getDesktopManager.deiconify(...) AWT, Swing, JavaFX & SWT 2
W JInternalFrame + JList Problem AWT, Swing, JavaFX & SWT 5
H Swing JInternalFrame aus JFrame ziehen AWT, Swing, JavaFX & SWT 6
N JInternalFrame minimieren und schließen AWT, Swing, JavaFX & SWT 2
T JFrame als JInternalFrame darstellen AWT, Swing, JavaFX & SWT 2
C Zeichnen über JInternalFrame der ICEpdf-Dokument anzeigt AWT, Swing, JavaFX & SWT 3
T Aussehen von JFrame bzw JInternalFrame ändern... wie? AWT, Swing, JavaFX & SWT 23
J Swing JInternalFrame AWT, Swing, JavaFX & SWT 5
S Swing JInternalFrame: Mehrere Probleme AWT, Swing, JavaFX & SWT 3
S Swing JInternalFrame: Titelleiste entfernen AWT, Swing, JavaFX & SWT 5
R Swing JFrame oder JInternalFrame? AWT, Swing, JavaFX & SWT 13
B JInternalFrame resize event AWT, Swing, JavaFX & SWT 2
X JInternalFrame AWT, Swing, JavaFX & SWT 3
G JInternalFrame AWT, Swing, JavaFX & SWT 2
W JInternalFrame alleine funktionsfähig AWT, Swing, JavaFX & SWT 5
A JSplitPane in JInternalFrame AWT, Swing, JavaFX & SWT 2
G JInternalFrame und beinhaltende Komponenten 'abschalten' AWT, Swing, JavaFX & SWT 2
K Tab von JPanel nach JInternalFrame AWT, Swing, JavaFX & SWT 2
M JInternalFrame Titel sichtbar setzen AWT, Swing, JavaFX & SWT 2
K JInternalFrame - schwarzer Bildschirm AWT, Swing, JavaFX & SWT 2
M JInternalFrame ohne Titelbalken AWT, Swing, JavaFX & SWT 5
A erneutes Öffnen jInternalFrame: illegal component position AWT, Swing, JavaFX & SWT 4
S Kontextmenu im JInternalFrame unterdrücken AWT, Swing, JavaFX & SWT 5
G Layerproblem JInternalFrame AWT, Swing, JavaFX & SWT 2
X Externe Anwendungen in JInternalframe starten. AWT, Swing, JavaFX & SWT 5
T JInternalFrame Vollbild Problem AWT, Swing, JavaFX & SWT 4
X Relative positionierung in einem JInternalFrame AWT, Swing, JavaFX & SWT 3
J JInternalFrame "schimmert" durch AWT, Swing, JavaFX & SWT 4
D JInternalFrame iconified Position nach parent-resize AWT, Swing, JavaFX & SWT 2
DeeDee0815 JInternalFrame in JScrollpane AWT, Swing, JavaFX & SWT 4
C Hilfe bei JInternalFrame AWT, Swing, JavaFX & SWT 6
J JInternalFrame überlagert/unterlagert anderen Elementen AWT, Swing, JavaFX & SWT 2
DeeDee0815 setContentPane()-Problem bei JInternalFrame AWT, Swing, JavaFX & SWT 2
W Unterdrückung von FrameIcon-Funktion im JInternalFrame AWT, Swing, JavaFX & SWT 5
F JInternalFrame Look and Feel AWT, Swing, JavaFX & SWT 3
W Realisierung Gradient in der Titlebar JInternalFrame AWT, Swing, JavaFX & SWT 7
T JInternalFrame und Iconified AWT, Swing, JavaFX & SWT 10
C Tooltip nur anzeigen, wenn JInternalFrame minimiert AWT, Swing, JavaFX & SWT 3
M JInternalFrame mouseEntered/mouseExited AWT, Swing, JavaFX & SWT 8
S Eine Art JInternalFrame in JSplitPane AWT, Swing, JavaFX & SWT 3
G Problem bei JTable in JInternalFrame AWT, Swing, JavaFX & SWT 4
megachucky JInternalFrame modal setzen AWT, Swing, JavaFX & SWT 3
megachucky JInternalFrame Größe und Location nicht einstellbar AWT, Swing, JavaFX & SWT 8
T JPanel mit paintComponent methode im JInternalFrame AWT, Swing, JavaFX & SWT 3
R Rückgabewert TreeSelectionListener für JInternalFrame AWT, Swing, JavaFX & SWT 4
J Applet in JInternalFrame laden AWT, Swing, JavaFX & SWT 9
B JInternalFrame in den Vordergrund rücken + Focus AWT, Swing, JavaFX & SWT 15
F Anzeigen eines JInternalFrame auf einen JFrame AWT, Swing, JavaFX & SWT 3
B JInternal Frame laden von anderem JInternalFrame AWT, Swing, JavaFX & SWT 3
A JInternalFrame setMaximizeable(false) wehrt sich AWT, Swing, JavaFX & SWT 2
S JInternalFrame AWT, Swing, JavaFX & SWT 8
welterde Menü in der Titelleiste des JInternalFrame AWT, Swing, JavaFX & SWT 4
S Problem, neuen JInternalFrame zur Laufzeit anzuzeigen AWT, Swing, JavaFX & SWT 8
M Cursor im deaktivierten JInternalFrame AWT, Swing, JavaFX & SWT 2
V JInternalFrame in einen Panel? AWT, Swing, JavaFX & SWT 2
C Scrollbalken bei einem JInternalFrame AWT, Swing, JavaFX & SWT 6
G JInternalFrame mit Doppelklick schließen möglich? AWT, Swing, JavaFX & SWT 2
D JInternalFrame unverschiebbar AWT, Swing, JavaFX & SWT 7
G JInternalFrame Fenster Status von Icon nach Normal? AWT, Swing, JavaFX & SWT 5
G lightweight >> heavyweight bei JInternalFrame für JMen AWT, Swing, JavaFX & SWT 13
P JInternalFrame: Verhindern das man es verschieben kann AWT, Swing, JavaFX & SWT 2
K JInternalFrame: internes Fenster zentrieren AWT, Swing, JavaFX & SWT 2
D JInternalFrame beim Öffnen nicht aktiv! AWT, Swing, JavaFX & SWT 5
A Probleme mit JInternalFrame AWT, Swing, JavaFX & SWT 5
javasdann Höhe von Titlebar in jInternalFrame ändern AWT, Swing, JavaFX & SWT 5
S Auf Komponenten eines JInternalFrame zugreifen AWT, Swing, JavaFX & SWT 2
A Ich kann kein JInternalFrame anzeigen ! AWT, Swing, JavaFX & SWT 7
P JInternalFrame - Problem AWT, Swing, JavaFX & SWT 3
F Listener für JPanel im JInternalFrame AWT, Swing, JavaFX & SWT 5
S finalizie() bei JInternalFrame wird nicht aufgerufen ! AWT, Swing, JavaFX & SWT 11
A JInternalFrame AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben