Mehdi
Mehdi

Reputation: 2228

positionnig myJTextField beside JComboBox

I want to creat a palet with many JComboBox. like that :

for(int x=0; x<MAX; x++){
    box[x] = new JComboBox(new String[]{"op1", "op2", "op3");
}

at the right of each JComboBox i want to create many JTextField. So, in my palet i will have some think like that:

myJComboBox1          myJTextField
                      anotherJTextField
                      anotherJTextField



myJComboBox2          myJTextField
                      anotherJTextField
                      anotherJTextField
...

How can i do that please ? I tried by setBounds and other layout like FlowLayout and GridLayout but without success.

Upvotes: 0

Views: 64

Answers (2)

Dakshinamurthy Karra
Dakshinamurthy Karra

Reputation: 5463

GridBagLayout is the best solution. However, if you are new to Swing, it might be a bit over complicated. In that case:

  1. Use GridLayout(0, 2) for the main panel.
  2. Wrap the combobox in a Panel with a border layout and add it to north. Add it to the main panel.
  3. Use another panel with GridLayout(0,1) add your text fields to it and add it to the main panel.

and loop...

Adding sample code:

package snippet;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class BorderLayoutTest extends JFrame {

    static private int MAX = 10 ;

    public BorderLayoutTest() {
        super(BorderLayoutTest.class.getName());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents();
    }

    private void initComponents() {
        setLayout(new GridLayout(0, 2));
        for(int i = 0; i < MAX; i++) {
            add(createComboPanel());
            add(createPanelWithTextFields());
        }
        pack();
    }

    public Component createComboPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(new JComboBox<>(new String[] { "First Option", "Second Option", "Third Option" }), BorderLayout.NORTH);
        return panel;
    }

    private Component createPanelWithTextFields() {
        JPanel panel = new JPanel(new GridLayout(0, 1));
        panel.add(new JTextField(30));
        panel.add(new JTextField(30));
        panel.add(new JTextField(30));
        return panel;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override public void run() {
                new BorderLayoutTest().setVisible(true);
            }
        });
    }

}

Upvotes: 2

schaeferpp
schaeferpp

Reputation: 119

Take a look at GridBagLayout. You can use your window like a table.

myPanel.setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;

JLabel lbl = new JLabel("bla");
myPanel.add(lbl, gbc);

gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weightx = 3;

JTextField tf = new JTextField();
myPanel.add(tf, gbc);

gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 1;
gbc.weightx = 3;

JTextField othertf = new JTextField();
myPanel.add(othertf, gbc);

You can even set weights and so on for the GridBagConstraints. It is completly adjusted as table. That will result in something like that:

label      textfield
           textfield

Just re-read the question. Just replace the JLabels with JComboBoxes and it answers your question a little bit better ;)

Upvotes: 2

Related Questions