Question

Je souhaite avoir un dialogue interne (fenêtre non) de demander la participation des membres. Je voudrais que le dialogue doit être placé au centre sur un JPanel existant.

Je l'ai regardé layeredpanes et ceux-ci semblent inutilisables en raison seulement d'avoir un seul gestionnaire de mise en page (ou pas de gestionnaire de mise en page) dans tous les volets. Je suppose que je pourrais essayer de passer outre JLayeredPane et fournir une mise en page personnalisée, mais cela semble extrême.

Les vitres ne semblent pas être soit approprié.

Comment cela peut-il être fait? Yat-il pas de concept utilisable z-index Swing?

EDIT

La raison en couches étaient Feuillets ne convient pas été en raison de l'absence d'un gestionnaire de mise en page par couche. Le panneau est redimensionnable, partie A doit rester à 100% de la superficie et le panneau B doit rester centralisée.

Était-ce utile?

La solution

Je pense que LayeredPane est votre meilleur pari ici. Vous avez besoin d'un troisième panneau mais pour contenir A et B. Ce troisième groupe serait le layeredPane puis le panneau A et B pourrait encore avoir une belle LayoutManagers. Tout ce que vous avez à faire est le centre B sur A et il y a beaucoup d'exemples dans la piste Swing sur la façon de le faire. Tutoriel pour le positionnement sans LayoutManager.

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();
    }

}

Vous utilisez setBounds pour positionner les panneaux à l'intérieur du panneau en couches et également de définir leur taille.

Modifier pour refléter les changements à la publication dorigine Vous devrez ajouter des écouteurs de composants qui détectent lorsque le conteneur parent est redimensionnée et modifier dynamiquement les limites du panneau A et B.

Autres conseils

Je pensais juste que j'ajouter que est une notion de Z-ordre Swing, voir [Java.awt.Component # setComponentZOrder] [1]

qui affecte les positions d'un composant dans sa matrice des parents de composant, qui détermine l'ordre de peinture.

Notez que vous devez remplacer javax.swing.JComponent # isOptimizedDrawingEnabled return false dans le conteneur parent pour obtenir vos composants qui se chevauchent à repeindre correctement, sinon leur repeint s'écraserait les uns des autres. (JComponents supposent pas d'enfants qui se chevauchent, sauf si isOptimizedDrawingEnabled retourne false)

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

Vous pouvez ajouter un undecorated JDialog comme ceci:

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);
  }
}

Utilisez un 1 par 1 GridLayout sur les JPanel existants, puis ajoutez votre panneau à ce JPanel. Le seul problème avec un GridLayout qui est 1 par 1 est que vous ne serez pas en mesure de placer d'autres articles sur le JPanel. Dans ce cas, vous devrez comprendre une mise en page qui convient. Chaque panneau que vous utilisez peut utiliser leur propre mise en page afin que ne serait pas un problème.

Suis-je comprendre cette question correctement?

JOptionPane.showInternalInputDialog ne probablement ce que vous voulez. Dans le cas contraire, il serait utile de comprendre ce qu'il manque.

Il y a un autre gestionnaire de mise en page qui peuvent intéresser ici: Mise en page Overlay Voici un tutoriel simple: OverlayLayout: pour la gestion de la mise en page des composants qui se trouvent sur le dessus les uns des autres . Mise en superposition vous permet de positionner les panneaux les uns sur les autres, et de définir une mise en page à l'intérieur de chaque panneau. Vous êtes également en mesure de définir la taille et la position de chaque panneau séparément.

(La raison pour laquelle je répondre à cette question des années est il y a parce que je suis tombé sur le même problème, et je l'ai vu très peu mentions de la mise en page de superposition sur StackOverflow, alors qu'il semble être assez bien documenté. Espérons que cela peut aider quelqu'un d'autre qui continue sa recherche.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top