Domanda

Ho inizializzato un GridBaglayout a livello globale, quindi nella mia classe costruttore l'ho istanziata e ho aggiunto alcuni pulsanti ecc. Ad esso.

Come posso aggiungere cose dopo il fatto? La classe semplice estende JFrame. Ogni volta che provo Class.Add (roba, GridBagConstraints) dopo il fatto (usato solo Aggiungi (roba, gribagConstraints) in costruttore) non succede nulla e nulla viene aggiunto al mio layout.

Devo "aggiornare" il gestore di layout o qualcosa del genere? È dichiarato a livello globale.

AGGIORNAMENTO: Ho provato a Revalidate () ma non sembra funzionare, ecco una versione semplificata del mio codice con un pulsante di prova in atto per la prova del concetto:

public class MainGUI extends JPanel{
    static GridBagConstraints c;
    static MainGUI mainGUIclass;
    static JFrame mainGUIframe;

    public MainGUI() {
    this.setLayout(new GridBagLayout());
    c = new GridBagConstraints();

    saveButton = new JButton("Save and Exit");
    saveButton.setPreferredSize(new Dimension(200, 30));

    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 4;
    add(saveButton, c);
    }

public static void main(String[] args) {
    mainGUIframe = new JFrame("Message");

    mainGUIframe.setSize(800,800);

    mainGUIclass = new MainGUI();

    mainGUIframe.add(mainGUIclass);
    mainGUIframe.setVisible(true);


   //now the addition
    JButton newButton = new JButton("New Button");  

    newButton.setPreferredSize(new Dimension(200, 30));


    c.gridx = 5;
    c.gridy = 0;
    c.gridwidth = 4;
    mainGUIclass.add(newButton,c);

    //none of this seems to work
    mainGUIclass.revalidate();//?
    mainGUIclass.repaint();//?

  }
}

Aggiornamento2: questo sembra essere un problema con la natura passbyValue di Java e un'altra classe (tela) che sto cercando di aggiungere al mio layout. Aggiornerò se trovo una soluzione.

Aggiornamento3: questo è un problema di thread, la classe che chiamo è appesa alla finestra principale.

Modifica: ho fornito il codice come riferimento e ho cercato di essere completo per fornire un'immagine completa, per non essere facilmente compilato da solo. Grazie a tutti coloro che hanno offerto la tua assistenza.

Update4: successo! La chiave era che la classe MediaPlayer ha fatto un controllo "isdisplayable ()", che ha fatto appendere il programma se il frame a cui veniva aggiunto non veniva aggiunto al GridBaglayout. Una serie di sfortunati pass per valori (di JinternalFrames), che preatta il frame interno alla gridbaglayout e un inizio remoto dei media da un altro metodo consente a ciò che sto cercando di lavorare.

È stato utile?

Soluzione

Nel tuo esempio stai aggiungendo un pulsante con esattamente lo stesso GridBagConstraints come il pulsante precedente. Quando provo a eseguire quel codice i tuoi pulsanti vengono posti uno sopra l'altro e quindi ne vedrai uno solo. Prova a cambiare il tuo GridBagConstraints in modo che il secondo pulsante aggiunto sia posizionato in un'altra posizione. Si consiglia la pratica per istanziare un nuovo GridBagConstraints per ogni componente vincolato per rimuovere la possibilità che tali errori di programmazione si verifichino.

Inoltre, per quanto riguarda il tuo aggiornamento, JFrame non ha un revalidate() funzione.

Se non l'hai già fatto, varrebbe la pena leggere a fondo questo.

Altri suggerimenti

Chiameresti revalidate() Sul contenitore (se deriva da JComponent come JPanel) che utilizza il layout per far ripartire i layout i componenti che contengono. Ciò dovrebbe ricorrere a tutti i contenitori detenuti da questo layout e anche loro dovrebbero aggiornare i loro layout dei componenti. La principale eccezione a questo che conosco sarebbero componenti tenuti a JScrollpanes e per questo, dovresti chiamare Revalidate su JViewport di Scrollpane.

Inoltre, a volte dovrai chiamare repaint() dopo revalidate(), soprattutto se hai rimosso qualsiasi componente detenuto dal contenitore.

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