2012-12-19 14 views
5

sto cercando di organizzare due serie di pulsanti per una GUI calcolatrice. Ognuno usa un GroupLayout per crearli. Un set è i numeri (e "."), L'altro è per i pulsanti operativi. Questo funziona fondamentalmente ma se uno dei pulsanti ha una lunghezza doppia (ad esempio il pulsante Uguale sul mio set di operazioni) getta gli altri pulsanti fuori linea. Userò le operazioni impostate come esempio. Ci sono due colonne e quattro file di pulsanti. La riga finale ha solo un pulsante - gli uguali. Voglio fare questa doppia lunghezza che si estende su entrambe le colonne. Al momento, semplicemente spinge la seconda colonna fino alla fine quando voglio che la seconda colonna si sieda sopra di essa.Java - miscelazione dimensioni dei componenti in GroupLayout

Ecco il codice per il layout - operLayout è il nome del layout per le operazioni, a sinistra e staffe destra sulla prima fila, + e - sul secondo, * e/sul terzo e uguale sull'ultima fila . Ogni pulsante ha un valore minimo impostato altrove (sono tutti uguali tranne gli uguali è il doppio).

operLayout.setAutoCreateGaps(true); 
operLayout.setAutoCreateContainerGaps(true); 
operLayout.setVerticalGroup(operLayout 
     .createSequentialGroup() 
     .addGroup(
operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(leftBracket) 
          .addComponent(rightBracket)) 
      .addGroup(operLayout.createParallelGroup().addComponent(add).addComponent(subtract)) 
      .addGroup(operLayout.createParallelGroup().addComponent(multiply).addComponent(divide)) 
      .addGroup(operLayout.createParallelGroup().addComponent(equals))); 
    operLayout.setHorizontalGroup(operLayout 
      .createSequentialGroup() 
      .addGroup(
        operLayout.createParallelGroup().addComponent(leftBracket).addComponent(add) 
          .addComponent(multiply).addComponent(equals)) 
      .addGroup(
        operLayout.createParallelGroup().addComponent(rightBracket).addComponent(subtract) 
          .addComponent(divide))); 

capisco perché questo sta accadendo ma non sono sicuro di come risolvere la cosa. C'è un modo semplice? O dovrei cambiare il modo in cui lo sto facendo? Grazie

+0

Mi congratulo per la scelta di 'GroupLayout' per questa attività. Credo che questo layout sia il più potente per la stesura di moduli standard. È facilmente trascurato perché è complicato da usare. Dopo aver appreso come funziona, lo uso quasi esclusivamente. –

+0

può riformattare il codice? Corrente; è piuttosto illeggibile. – ArtB

+0

sì, per favore, anche se qualcuno potrebbe averti battuto. Grazie @ErickRobertson, so cosa vuoi dire, sembra complicato ma una volta capito che, è davvero utile! – PatrickJBC

risposta

3

Inserire il componente equals nel proprio gruppo orizzontale parallelo.

Prima di tutto, assicurarsi di utilizzare un rientro coerente quando si utilizza GroupLayout. Ho trovato questo assolutamente vitale per tenere traccia di ciò che sta accadendo.

Il motivo per cui si sta osservando il comportamento segnalato è perché il segno di uguale fa parte dello stesso gruppo parallelo orizzontale della prima colonna di pulsanti. Quindi, quando lo raddoppi, spinge la seconda colonna di pulsanti a destra. Questo è esattamente ciò che stai dicendo di fare perché stai dicendo di rimanere nel primo gruppo parallelo (colonna).

Per ottenere il comportamento desiderato, è necessario eseguire il layout del pulsante separatamente, in parallelo agli altri pulsanti. Lo fai mettendolo nel suo stesso gruppo parallelo. Probabilmente vuoi mettere un allineamento su questo gruppo anche per ottenere il miglior comportamento. Penso che GroupLayout.Alignment.CENTER sia quello che vuoi.

Si noti inoltre che non è necessario per creare un nuovo gruppo, se è solo andando ad avere un componente in esso. Basta aggiungere quel componente, invece.

operLayout.setVerticalGroup(operLayout.createSequentialGroup() 
    .addGroup(operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
     .addComponent(leftBracket) 
     .addComponent(rightBracket)) 
    .addGroup(operLayout.createParallelGroup() 
     .addComponent(add) 
     .addComponent(subtract)) 
    .addGroup(operLayout.createParallelGroup() 
     .addComponent(multiply) 
     .addComponent(divide)) 
    .addComponent(equals)); 
operLayout.setHorizontalGroup(operLayout.createParallelGroup() 
    .addGroup(operLayout.createSequentialGroup() 
     .addGroup(operLayout.createParallelGroup() 
      .addComponent(leftBracket) 
      .addComponent(add) 
      .addComponent(multiply)) 
     .addGroup(operLayout.createParallelGroup() 
      .addComponent(rightBracket) 
      .addComponent(subtract) 
      .addComponent(divide))) 
    .addComponent(equals)); 
+0

grazie per il tuo aiuto! sì, mi rendo conto che era quello che stavo dicendo a, il risultato ho ottenuto non mi ha stupito, solo che non ero sicuro di come riorganizzare per farlo bene. Non capisco bene cosa stai dicendo di fare anche se come dici tu per metterlo nel proprio gruppo parallelo (orizzontale o verticale? Io assumerei verticale o forse entrambi?) Ma poi dici che se è un componente non lo fa Ho bisogno di un gruppo. Ho provato il codice che hai fornito e le variazioni su ciò che hai detto con i gruppi/solo componenti, usando l'allineamento del centro ma non c'è alcun cambiamento in quello che ho avuto. – PatrickJBC

+0

ok scusa, mi sono appena accorto che hai detto orizzontale per iniziare, ma farlo non risolve il problema. – PatrickJBC

+0

Non so perché questo non risolva il problema per te.Assicurati che le rientranze coincidano con le parentesi in modo da aggiungere il componente al gruppo appropriato. Dovrebbe essere aggiunto in parallelo al gruppo sequenziale che contiene le due colonne all'interno del gruppo orizzontale. Funziona, quindi non sono sicuro di quello che stai facendo in modo diverso. Ma non sarei sorpreso se si trovi nel posto sbagliato in base al modo in cui è stato organizzato il codice originale. –