2012-04-04 19 views
6

Come posizionare i componenti nel layout in una posizione specifica. Come voglio mettere 2 caselle di testo nella prima riga, sotto 3 caselle combinate.Come posizionare i componenti in posizioni specifiche?

Ma quando sto provando a metterli tutti appaiono in una riga e ho usato flowlayout. Ho usato anche il confine. Quando eseguo il ridimensionamento, le dimensioni della finestra dei componenti escono dal bordo.

Potete suggerirmi alcuni layout da usare e come usarlo?

Ecco il mio codice:

topPanel=new JPanel(); 
topPanel.setLayout(new FlowLayout()); 
topPanel.setBorder(new TitledBorder(new EtchedBorder(), "Customer Data")); 

CNameTextField = new JTextField (20); // create the Customer Name text field 
CNameTextField.setEditable(true);  // set editable text box 

CIDLabel=new JLabel("Customer ID"); 

C_IDTextField = new JTextField (10); 
C_IDTextField.setEditable(true);  // set editable text box 

topPanel.add(CNameTextField); 
topPanel.add(C_IDTextField); 

// Create and populate Room type combo box 
roomTypeCombo = new JComboBox(); 
roomTypeCombo.addItem("Budget($50)");  

// Create and populate Meal type combo box 
mealCombo = new JComboBox(); 
mealCombo.addItem("None");  

// Create and populate Days combo box 

daysCombo = new JComboBox(); 

for(int i=0;i<31 ; i++) { 
      // populate combobox with days 
    daysCombo.addItem(i); 
} 
    // Adding rest of the components to top panel 
topPanel.add(roomTypeCombo); 
topPanel.add(mealCombo); 
topPanel.add(daysCombo); 

Grazie.

+2

Se posso, usare [MigLayout] (http://www.miglayout.com/) troppo buono per queste cose, e troppo facile da implementare :-) o si può andare con [GridBagLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html), solo questo è un po 'difficile da gestire a volte :-( –

risposta

5

Provare a modificare il layout. http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

Si potrebbe andare per un GridLayout con due linee (per esempio, v'è alcuni altri possibili combinazioni), con ciascuna riga contenente rispettivamente 3 JComboBoxs, e due JTextFields.

Osservare attentamente la documentazione e verificare alcuni esempi facilmente raggiungibili sul web.

import java.awt.GridLayout; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class SwingResizeJFrame { 

    public SwingResizeJFrame() { 
     JTextField TextField1 = new JTextField("firstTextField"); 
     JTextField TextField2 = new JTextField("secondTextField"); 
     JPanel firstPanel = new JPanel(); 
     firstPanel.setLayout(new GridLayout(0, 2, 10, 10)); 
     firstPanel.add(TextField1); 
     firstPanel.add(TextField2); 

     JComboBox comboBox1 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"}); 
     JComboBox comboBox2 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"}); 
     JComboBox comboBox3 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"}); 
     JPanel secondPanel = new JPanel(); 
     secondPanel.setLayout(new GridLayout(0, 3, 10, 10)); 
     secondPanel.add(comboBox1); 
     secondPanel.add(comboBox2); 
     secondPanel.add(comboBox3); 

     JFrame frame = new JFrame(); 
     frame.setLayout(new GridLayout(2, 1, 10, 10)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(firstPanel); 
     frame.add(secondPanel); 
     frame.pack(); 
     frame.setLocation(150, 150); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       SwingResizeJFrame demo = new SwingResizeJFrame(); 
      } 
     }); 
    } 
} 
+0

Sono d'accordo. Avevo fretta di inviare il codice Grazie, non è il modo migliore per farlo, forse si verificheranno dei problemi durante il ridimensionamento della finestra no (non c'è tempo per testare) –

7

Il tipo più specifico di layout è il posizionamento assoluto.

Attenzione: Posizionamento assoluto dovrebbe raramente, se mai, essere usato. Ci sono molte ragioni per cui. Eccone uno: Absolute positioning (No layout manager) vs. absolute positioning in MiGlayout

- Grazie all'utente brimborium per la buona idea di aggiungere un avviso.

Detto questo, ecco come utilizzare il posizionamento assoluto:

Nel codice di cui sopra, invece di impostare topPanel s' layout per FlowLayout, impostarlo su null.

topPanel.setLayout(null); 

Più avanti nel codice, giusto prima di iniziare l'aggiunta di componenti a topPanel, chiamare setBounds il metodo del contenitore:

someJComponent.setBounds(x-coord, y-coord, width, height); 

Così, per esempio si è creato un'istanza di JComboBox() e la chiamò roomTypeCombo , il codice seguente mostra come posizionare assolutamente roomTypeCombo.

topPanel.setLayout(null); 

// code... 

roomTypeCombo = new JComboBox(); 

// code... 

roomTypeCombo.setBounds(100, 100, 200, 50); 
topPanel.add(roomTypeCombo); 


Il metodo setBounds, utilizzato in precedenza, ha quattro parametri:
int x-coord - impostare le roomTypeCombo 's x-coordinano rispetto al suo genitore, topPanel.
int y-coord - impostare la coordinata y di roomTypeCombo relativa al relativo parent, topPanel.
int width, int height - Gli ultimi due parametri specificano la larghezza e l'altezza di roomTypeCombo, il che è piuttosto auto-esplicativo.


vorrei solo giocare con le coordinate e vedere se ti piace tutto ciò che viene fuori di esso, la cosa peggiore che potrebbe accadere è che si torna a utilizzare un layout, che è probabilmente meglio di posizionamento assoluto. Oppure puoi implementare il tuo layout manager, se segui questo collegamento ipertestuale la prima risposta parla dell'implementazione del proprio gestore di layout e di link utili.

Mi dispiace se non ho scritto nulla che ti abbia aiutato.

More information on absolute positioning

+1

Risposta perfetta a questa domanda: mi chiedo perché è stata scelta l'altra risposta. dovrebbe esserci un avvertimento, che il posizionamento assoluto è nella maggior parte dei casi ** non ** il modo di farlo.) – brimborium

Problemi correlati