Domanda

Vorrei avere un dialogo interno (non finestra) a chiedere per l'input utente. Vorrei che la finestra di dialogo per essere posizionato centralmente su un JPanel esistente.

Ho guardato layeredpanes e questi sembrare inutilizzabile a causa di solo avere un unico gestore di layout (o nessun gestore di layout) in tutti i vetri. Credo che avrei potuto cercare di ignorare JLayeredPane e fornire un layout personalizzato, ma questo sembra estremo.

Vetri non sembrano essere appropriato sia.

Come si può fare? Non c'è il concetto utile di z-indici in Swing?

Modifica

Il motivo Layered riquadri non erano appropriato è dovuto alla mancanza di un gestore di layout per strato. Il pannello è ridimensionabile, Pannello A deve rimanere al 100% della superficie e il Pannello di B deve rimanere centrale.

È stato utile?

Soluzione

Credo LayeredPane è la soluzione migliore qui. Si avrebbe bisogno di un terzo pannello anche se per contenere A e B. Questo terzo pannello sarebbe il layeredPane e poi pannello A e B potrebbe ancora avere un bel LayoutManagers. Tutto quello che dovete fare è centro di B su A e c'è un sacco di esempi nel percorso Swing su come fare questo. Tutorial per il posizionamento senza un 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();
    }

}

Si utilizza setBounds per posizionare i pannelli all'interno del riquadro a strati e anche per impostare le loro dimensioni.

Modifica per riflettere modifiche al post originale Sarà necessario aggiungere listener componenti che rilevare quando il contenitore principale viene ridimensionato e quindi modificare in modo dinamico i limiti di pannello A e B.

Altri suggerimenti

Ho solo pensato che mi piacerebbe aggiungere che ci è una nozione di ordine Z in Swing, vedere [Java.awt.Component # setComponentZOrder] [1]

che colpisce le posizioni di una componente nella sua matrice componente genitori, che determina l'ordine pittura.

Si noti che è necessario eseguire l'override javax.swing.JComponent # isOptimizedDrawingEnabled per ritornare false nel contenitore padre per ottenere i componenti che coincidono per ridisegna correttamente, altrimenti i loro ridipinge saranno clobber vicenda. (JComponents assumono senza figli che si sovrappongono a meno isOptimizedDrawingEnabled restituisce false)

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

È possibile aggiungere un JDialog non decorato in questo modo:

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

Utilizzare un 1 da 1 GridLayout sulle JPanel esistenti, quindi aggiungere il pannello a quella JPanel. L'unico problema con un GridLayout che è 1 da 1 è che non sarà in grado di collocare altri oggetti sul JPanel. In questo caso, si dovrà trovare un layout che è adatto. Ogni pannello che si utilizza può utilizzare il proprio layout in modo che non sarebbe stato un problema.

Sono capire questa domanda correttamente?

JOptionPane.showInternalInputDialog probabilmente fa quello che vuoi. In caso contrario, sarebbe utile per capire che cosa manca.

C'è un altro gestore di layout che ti potrebbero interessare qui: Overlay layout Ecco un semplice tutorial: OverlayLayout: per la gestione del layout dei componenti che si trovano su uno sopra l'altro . Disposizione overlay consente di posizionare i pannelli uno sopra l'altro, e impostare un layout all'interno di ciascun pannello. Tu sei anche in grado di impostare la dimensione e la posizione di ogni pannello separatamente.

(La ragione per cui sto rispondere a questa domanda da anni fa è perché ho inciampato sullo stesso problema, e ho visto pochissimi menzioni del layout Overlay su StackOverflow, mentre sembra essere abbastanza ben documentato. Speriamo che questo può aiutare qualcun altro che continua a cercarlo.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top