Domanda

Voglio layout il mio jpane come così:

-------
|     |
|     |
|     |
-------
|     |
-------
.

In questo modo, la sezione superiore è più grande / più alta della sezione inferiore (la sezione superiore è composta da un altro JPanel e utilizza l'oggetto grafico per visualizzare un'immagine, mentre la sezione inferiore consiste anche in un altro JPanel ma utilizza l'oggetto grafico a Disegna alcune linee e testo).

Ho sentito che il modo migliore per farlo stava usando il GridbaGlayout e GridbagConaints.

Sto cercando di capire le proprietà appropriate per i GridbagGonaints, e sto avendo delle difficoltà. Questo è quello che ho finora ...

Per la parte superiore, ho:

gridx = 0
gridy = 0
weighty = 1.0; // expand downwards, because the bottom should never expand in the Y direction
fill = GridBagConstraints.BOTH
.

Per la parte inferiore, ho:

gridx = 0
gridy = 1
fill = GridBagConstraints.HORIZONTAL
anchor = GridBagConstraints.PAGE_END
.

Sfortunatamente, tutti i finali per accadere sono un grande rettangolo grigio (ho uno sfondo bianco per l'applicazione) - nessuna immagine carica, non appaiono linee / testo.

Cosa dovrei fare? Cosa dovrei regolare?

Ho letto alcuni tutorial, ma sembra solo davvero confuso, ho capito nella mia prima applicazione, ma ora quando provo a fare questo, non sembra funzionare per me.

È stato utile?

Soluzione

In generale, per layout Gridbag

    .
  • Se si desidera una scala del componente, è necessario fornire la sua direzione della scala un peso e qualsiasi dimensione (larghezza / altezza) impostata per quella direzione verrà ignorata dal gestore del layout.

    Se non si desidera una scala del componente, il componente deve avere la sua dimensione definita (se vuoi, è possibile scavare in questo argomento nei documenti di Java). Nel tuo caso del pannello inferiore, è necessario dare il suo, almeno, un'altezza preferita.

    Questo può funzionare come aspettativa

    pnlTop.setBackground(Color.WHITE);
    pnlBottom.setBackground(Color.BLUE);
    
    // Because you don't want the bottom panel scale, you need to give it a height.
    // Because you want the bottom panel scale x, you can give it any width as the
    // layout manager will ignore it.
    pnlBottom.setPreferredSize(new Dimension(1, 20));
    
    
    getContentPane().setLayout(new GridBagLayout());
    GridBagConstraints cst = new GridBagConstraints();
    cst.fill = GridBagConstraints.BOTH;
    cst.gridx = 0;
    cst.gridy = 0;
    cst.weightx = 1.0; // --> You miss this for the top panel
    cst.weighty = 1.0;
    getContentPane().add(pnlTop, cst);
    
    cst = new GridBagConstraints();
    cst.fill = GridBagConstraints.HORIZONTAL;
    cst.gridx = 0;
    cst.gridy = 1;
    cst.weightx = 1.0; // You miss this for the bottom panel
    cst.weighty = 0.0;
    getContentPane().add(pnlBottom, cst);
    
    .


    .

    Ulteriori informazioni, se si desidera utilizzare layout Gridbag, ti consiglio di provare la libreria indolore-gridbag http://code.google.com/p/painless-gridbag/ (Sono l'autore di quella biblioteca). Non risolve questo problema per te (come il tuo problema riguarda la gestione delle dimensioni del componente nel layout di Gridbag) ma ti farà risparmiare un sacco di digitazione e renderà il tuo codice più facile da mantenere

    pnlBottom.setPreferredSize(new Dimension(1, 20));
    
    PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false);
    gbl.row().cell(pnlTop).fillXY();
    gbl.row().cell(pnlBottom).fillX();
    gbl.done();
    
    .

Altri suggerimenti

Non sono sicuro dalla tua domanda, forse ti aiuterà a top al 70%, in basso al 30%

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class BorderPanels extends JFrame {

    private static final long serialVersionUID = 1L;

    public BorderPanels() {
        getContentPane().setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        JPanel panel1 = new JPanel();
        Border eBorder = BorderFactory.createEtchedBorder();
        panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "70pct"));
        gbc.gridx = gbc.gridy = 0;
        gbc.gridwidth = gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx = gbc.weighty = 70;
        getContentPane().add(panel1, gbc);
        JPanel panel2 = new JPanel();
        panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "30pct"));
        gbc.gridy = 1;
        gbc.weightx = 30;
        gbc.weighty = 30;
        gbc.insets = new Insets(2, 2, 2, 2);
        getContentPane().add(panel2, gbc);
        pack();
    }

    public static void main(String[] args) {
        new BorderPanels().setVisible(true);
    }
}
.

Se è possibile utilizzare 3 ° Party Libs, è possibile considerare il FormLayout pure.Ti consente di specificare l'altezza di ogni riga e il comportamento di ridimensiona.

Non ho testato questo ma

FormLayout layout = new FormLayout( 
 "pref", //columns
 "50dlu:grow(0.2)","25dlu:grow(0.1)" //rows
);
.

potrebbe fare il trucco.Ulteriori informazioni sulla sintassi possono essere trovate in JGoodies Forms PDF

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