Frage

Ich möchte einen internen (nicht Fenster) Dialog haben, um Mitglied Eingabe zu fragen. Ich würde den Dialog gerne zentral auf einem vorhandenen JPanel platziert werden.

Ich habe unter layeredpanes und diese (oder kein Layout-Manager) über alle Scheiben unbrauchbar scheinen nur aufgrund eines einzelnen Layout-Manager mit. Ich glaube, ich könnte versuchen, JLayeredPane außer Kraft zu setzen und ein benutzerdefiniertes Layout bietet aber dies scheint extrem.

Glasscheiben scheint nicht zu angemessen entweder.

Wie kann dies geschehen? Gibt es kein brauchbares Konzept des z-Indizes in Swing?

Bearbeiten

Der Grund Layered Panes nicht geeignet war, war das Fehlen eines Layout-Manager pro Schicht fällig. Das Panel ist resizeable, Panel A bei 100% der Fläche bleiben sollte und Panel B sollte zentralisiert bleiben.

War es hilfreich?

Lösung

Ich denke, LayeredPane ist die beste Wahl hier. Sie würden eine dritte Platte müssen allerdings A enthalten und B. Diese dritte Platte würde die layeredPane sein und dann Panel A und B noch eine schöne LayoutManagers haben könnte. Alles, was Sie tun mußten ist Zentrum B über A, und es gibt eine ganze Reihe von Beispielen in der Swing-Karte auf, wie dies zu tun. Tutorial zur Positionierung ohne Layout .

public class Main {
    private JFrame frame = new JFrame();
    private JLayeredPane lpane = new JLayeredPane();
    private JPanel panelBlue = new JPanel();
    private JPanel panelGreen = new JPanel();
    public Main()
    {
        frame.setPreferredSize(new Dimension(600, 400));
        frame.setLayout(new BorderLayout());
        frame.add(lpane, BorderLayout.CENTER);
        lpane.setBounds(0, 0, 600, 400);
        panelBlue.setBackground(Color.BLUE);
        panelBlue.setBounds(0, 0, 600, 400);
        panelBlue.setOpaque(true);
        panelGreen.setBackground(Color.GREEN);
        panelGreen.setBounds(200, 100, 100, 100);
        panelGreen.setOpaque(true);
        lpane.add(panelBlue, new Integer(0), 0);
        lpane.add(panelGreen, new Integer(1), 0);
        frame.pack();
        frame.setVisible(true);
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main();
    }

}

Sie verwenden setBounds die Platten im Inneren des Schichtscheibe zu positionieren und auch ihre Größe eingestellt werden.

Bearbeiten, um Änderungen zu dem ursprünglichen Post Sie müssen Komponente Listener hinzufügen, die erkennen, wenn der übergeordneten Container der Größe verändert wird, und ändern Sie dann dynamisch die Grenzen der Tafel A und B.

Andere Tipps

Ich dachte nur, dass ich hinzufügen würde, dass es ist ein Begriff der Z-Ordnung in Swing, siehe [Java.awt.Component # setComponentZOrder] [1]

, die die Positionen einer Komponente in seiner Eltern Komponente Array betrifft, die die Malerei, um bestimmt.

Beachten Sie, dass Sie sollten außer Kraft setzen javax.swing.JComponent # isOptimizedDrawingEnabled in den übergeordneten Container falsch zurück Ihre überlappende Komponenten zu erhalten richtig neu zu zeichnen, sonst wird verprügeln ihre Bemalungen einander. (JComponents nehmen keine überlappenden Kinder, es sei denn isOptimizedDrawingEnabled false zurück)

[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Container.html#setComponentZOrder (java.awt.Component , int)

Sie können eine undecorated JDialog wie folgt hinzu:

import java.awt.event.*;

import javax.swing.*;

public class TestSwing {
  public static void main(String[] args) throws Exception {
    JFrame frame = new JFrame("Parent");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(800, 600);
    frame.setVisible(true);

    final JDialog dialog = new JDialog(frame, "Child", true);    
    dialog.setSize(300, 200);
    dialog.setLocationRelativeTo(frame);
    JButton button = new JButton("Button");
    button.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        dialog.dispose();
      }
    });
    dialog.add(button);
    dialog.setUndecorated(true);
    dialog.setVisible(true);
  }
}

Verwenden Sie ein 1 von 1 Gridlayout auf dem vorhandenen JPanel, dann fügen Sie Ihren Panel zu diesem JPanel. Das einzige Problem mit einem Gridlayout, das 1 von 1 ist, dass Sie nicht in der Lage sein werden, andere Elemente auf dem JPanel zu platzieren. In diesem Fall wird ein Layout herauszufinden muß, die geeignet ist. Jede Platte, die Sie verwenden können, ihr eigenes Layout verwenden, so dass kein Problem sein würde.

Bin ich Verständnis dieser Frage richtig?

JOptionPane.showInternalInputDialog wohl tut, was Sie wollen. Wenn nicht, wäre es hilfreich, zu verstehen, was es fehlt.

Es gibt einen anderen Layout-Manager, der hier von Interesse sein können: Overlay-Layout Hier ist ein einfaches Tutorial: OverlayLayout: für Layout-Management von Komponenten, die auf der Oberseite einander liegen . Overlay-Layout können Sie Panels auf aufeinander positionieren und ein Layout innerhalb jeder Platte gesetzt. Sie sind auch in der Lage separat Größe und Position jedes Feldes zu setzen.

(Der Grund, warum ich diese Frage von Jahren bin zu beantworten ist vor, weil ich auf das gleiche Problem gestolpert, und ich habe nur sehr wenige gesehen Erwähnungen des Overlay-Layouts auf Stackoverflow, während es ziemlich gut dokumentiert zu sein scheint. Hoffentlich kann helfen, jemand anderes, denn es hält die Suche.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top