Frustrazione con i gestori di layout di Java Swing

3

Da anni cerco di padroneggiare i layout manager di Swing senza successo. Ogni volta che ho bisogno di fare qualcosa con Swing, è come tirare le unghie per far allineare i componenti visivi nel modo in cui voglio. Conosco quadri come Matisse, ma non è questo il punto.

La mia domanda è: perché Swing ha bisogno anche di gestori di layout? Sembra un paradigma complicato. Quello che vorrei essere in grado di fare è jave un semplice JFrame e poi per ogni componente (come JLabel) semplicemente specificare le coordinate X e Y dove voglio che sia posizionato - affare fatto. Qualcuno può spiegare cosa c'è di sbagliato in questo approccio semplice che funzionerebbe prevedibilmente al 100% delle volte? O c'è un vero gestore di layout che fa cose esattamente come questa?

    
posta amphibient 18.01.2013 - 19:46
fonte

7 risposte

6

What I would like to be able to do is jave a simple JFrame and then for each component (like JLabel) simply specify X and Y coordinates where I want it to be situated -- done deal.

Puoi farlo con null layout:

jPanel.setLayout(null);
jLabel.setBounds(5, 5, 200, 300);
jPanel.add(jLabel);
jFrame.add(jPanel);
    
risposta data 19.01.2013 - 16:14
fonte
18

Forse sei troppo giovane per ricordare quando programmare senza i gestori di layout era più comune. O dovevi sistemare il tuo schermo in una sola misura, il che andava benissimo a meno che tu non avessi davvero bisogno di condividere la tua applicazione con qualcuno che usasse una diversa risoluzione dello schermo, o dovevi affrontare un ridimensionamento che sembrava davvero pessimo.

Una parte del problema è ciò che potresti considerare il ridimensionamento "naturale" ed "ovvio" è in realtà piuttosto complesso sotto il cofano. Alcuni componenti, come un'area di testo, possono essere ridimensionati in entrambe le direzioni e sembrano ancora abbastanza buoni. Alcuni componenti, ad esempio una casella combinata, sembrano buoni solo se ridimensionati in direzione orizzontale e alcuni componenti, come i pulsanti, appaiono raramente naturali quando vengono ridimensionati più di un pò in entrambe le direzioni. I gestori di layout ti consentono di mescolare e abbinare i componenti e rendono ancora più naturale l'aspetto del ridimensionamento.

    
risposta data 18.01.2013 - 20:04
fonte
8

Altri toolkit hanno concetti equivalenti (ad es. Tk ha anche gestori di geometrie) e sono assolutamente fondamentali per avere una GUI che non sia fissa con una dimensione esatta. Ciò conta quando:

  1. hai caratteri che possono cambiare di dimensioni per motivi di accessibilità o
  2. hai dimensioni diverse degli schermi o
  3. hai finestre ridimensionabili o
  4. hai quantità variabili di contenuti in alcuni componenti.

Questo non è un elenco completo dei motivi per cui potresti volere un dimensionamento adattivo, ma dimostra che potresti non avere il controllo sul posizionamento e il dimensionamento preciso delle cose, anche se potresti volerlo. Molto meglio smettere di cercare di controllare le cose a livello di pixel e lasciare che il computer si prenda cura di te seguendo le regole più generali che descrivi; ciò che i gestori di layout fanno è applicare tali regole.

FWIW, scrivere un buon gestore di layout è difficile. Davvero difficile. Infatti, quello che conosco mi dà i migliori layout nella mia esperienza (il gestore di griglia di Tk, che è una sorta di GridBagManager truccato, tranne senza il suck) è internamente un complicato risolutore di equazioni simultanee con alcune euristiche spaventose per assicurare che un la risposta si apre anche quando le direttive dell'utente non danno una soluzione. Ha anche avuto un po 'di anni di sforzi per il suo sviluppo (davvero!) Quindi non mi aspetterei che fosse riprodotto facilmente. A causa della generale difficoltà nel fare i gestori di layout, la maggior parte delle persone che li scrivono tendono a scrivere quelli molto specifici che non fanno un lavoro particolarmente intelligente, ma dove l'implementazione è abbastanza semplice da essere almeno facile da gestire nei casi più semplici a loro interessa davvero.

    
risposta data 19.01.2013 - 00:11
fonte
5

Considera l'utilizzo di MigLayout . È un gestore di layout completo con cui non ho avuto problemi. Per avere un assaggio iniziale di ciò che è capace e di quanto è facile da usare, guarda l'applicazione di esempio collegata dalla home page. Assicurati di provare a ridimensionare la finestra per vedere come l'interfaccia utente è in grado di adattarsi alle dimensioni dello schermo.

Il motivo principale dietro i gestori di layout è consentire alla tua applicazione di adattarsi in modo elegante a ciò che l'utente desidera o ha bisogno. MigLayout semplifica questo problema fornendo un numero enorme di vincoli e regole facilmente modificabili, alcuni dei quali lo rendono più potente di HTML + CSS in alcune aree (anche se questo sta finalmente cambiando). Include anche una modalità di debug che mostra esattamente cosa sta cercando di fare e ha la possibilità di disporre i pulsanti in base al sistema operativo dell'utente.

Alcuni esempi di posizionamento assoluto:

// adds item at 100, 100
panel.add(item, "pos 100, 100");
// adds item 10% + 5 "logical pixels" + 1 inch from left side of parent
// and centers itself 75% of the way down parent component
panel.add(item, "pos (10% + 5lp + 1in) .75al"); 

I dettagli possono essere trovati sul tutorial, sull'applicazione di esempio e sul cheat sheet collegato alla pagina principale.

    
risposta data 08.02.2013 - 01:49
fonte
2

Bene, Swing ha bisogno di un gestore di layout perché dovrebbe essere multipiattaforma e quindi renderà componenti di dimensioni diverse su piattaforme diverse. Usando la regola della matematica per allineare gli elementi lo rende molto più portabile.

A proposito, se vuoi un buon controllo sul posizionamento pur rimanendo fluido, puoi controllare GroupLayout. Non è perfetto, ma ti dà un controllo relativamente preciso, e lo uso molto spesso

    
risposta data 18.01.2013 - 21:14
fonte
0

Come già detto layoutManager perché gli schermi hanno dimensioni molto diverse.

Come già accennato, suggerirei di utilizzare TableLayout

La maggior parte dei miei schermi è abbastanza semplice, ho il mio front-end per Swing che mi permette di definire semplici schermate come:

pnl.addLine("Record Name", sfRecordName);
pnl.addLine("Description", sfDescription)
       .setHeight(DESCRIPTION_HEIGHT);
pnl.addLine("Record Type", sfRecordType);
pnl.addLine("System",      sfSystem)
       .setGap(BasePanel.GAP0);
pnl.addLine("List",        sfList);

Dietro la scena il metodo addLine usa tableLayout per impaginare lo schermo, inoltre

  • opzionalmente imposta il nome del campo (al prompt) che è utile in alcuni strumenti di Swing Testing (ad esempio, le prime versioni di Marathon)
  • Conversione della lingua

Dai un'occhiata, sono disponibili vari front-end Swing

    
risposta data 19.01.2013 - 09:44
fonte
0

specifica semplicemente le coordinate X e Y dove voglio che sia posizionato

Sì, quando ridimensionate la finestra, le dimensioni di JLabel e dell'editor di testo non verranno regolate in base allo schermo. Rimarrà impostato come lo stesso posizionamento.

Puoi modificare il layout con il layout personalizzato ma è più difficile utilizzarne uno personalizzato rispetto al gestore del layout.

Se scegli il giusto gestore di layout , semplificherà il tuo lavoro.

Ma quando aggiungi il layout, le dimensioni delle etichette verranno regolate in base al layout.

    
risposta data 03.01.2017 - 13:36
fonte

Leggi altre domande sui tag