views:

33

answers:

3

Hi I want to make an input form so that the user can enter details in java code.

Something like this :

alt text


MY CODE

import java.awt.GridLayout;
import javax.swing.*;

class JOptionPaneTest {

public static void main(String[] args) {
    String[] items = {"One", "Two", "Three", "Four", "Five"};
    JComboBox combo = new JComboBox(items);
    JTextField field1 = new JTextField("1234.56");
    JTextField field2 = new JTextField("9876.54");
    JPanel panel = new JPanel(new GridLayout(0, 1));
    panel.add(combo);
    panel.add(new JLabel("Field 1:"));
    panel.add(field1);
    panel.add(new JLabel("Field 2:"));
    panel.add(field2);
   int result = JOptionPane.showConfirmDialog(null, panel, "Test",
        JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
    if (result == JOptionPane.OK_OPTION) {
        System.out.println(combo.getSelectedItem()
            + " " + field1.getText()
            + " " + field2.getText());
    } else {
        System.out.println("Cancelled");
    }
}
}

My output form :

alt text

I think I must change my layout to something like borderLayout. Any ideas to get the look of the form in the top of the question(1st image from top).

Many Thanks

+1  A: 

You are currently using a GridLayout, which can be fine for your need.

However, you should initialize it with the actual number of rows and columns you will need. In your case:

new GridLayout(0, 2); 

0 for rows means there is not limit, and you have 2 columns, one for the labels, and one for the input component. See the Java tutorial for more information on GridLayouts.

alt text

Note however that the GridLayout will make all "cells" to be the same size, which can be a problem for the labels.

However, Jonas is right, a SpringLayout is probably more adapted to your need.

Gnoupi
+2  A: 

Yes, you have to change layout. Have a look at SpringLayout and this example:

alt text

String[] labels = {"Name: ", "Fax: ", "Email: ", "Address: "};
int numPairs = labels.length;

//Create and populate the panel.
JPanel p = new JPanel(new SpringLayout());
for (int i = 0; i < numPairs; i++) {
    JLabel l = new JLabel(labels[i], JLabel.TRAILING);
    p.add(l);
    JTextField textField = new JTextField(10);
    l.setLabelFor(textField);
    p.add(textField);
}

//Lay out the panel.
SpringUtilities.makeCompactGrid(p,
                                numPairs, 2, //rows, cols
                                6, 6,        //initX, initY
                                6, 6);       //xPad, yPad

SpringLayout works fine for this simple form, but there is third party libraries that has more features. I.e. MiG Layout.

Jonas
A: 

You can do this with DesignGridLayout. The following snippet should work (sorry I could not test it I am not on my dev station right now):

DesignGridLayout layout = new DesignGridLayout(panel);
layout.row().grid(streetAddressLabel).add(streetAddressField);
layout.row().grid(cityLabel).add(cityField);
layout.row().grid(stateLabel).add(stateSpinner);
layout.row().grid(zipLabel).add(zipField);
layout.emptyRow();
layout.row().right().add(setAddressButton, clearAddressButton);

Then you would use JDialog (rather than JOptionPane) to display your panel.

jfpoilpret