Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java GUI, organizing a dialog box to get data from the user

I am designing a GUI for my research project. I want to create a dialog box that gets information from the user. Here is the screenshot:

Image of current state

Here is the code for the screenshot above:

JTextField projnameField = new JTextField(10);
JTextField nField = new JTextField(5);
JTextField mField = new JTextField(5);
JTextField alphaField = new JTextField(5);
JTextField kField = new JTextField(5);

JFileChooser inputfile = new JFileChooser();
inputfile.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

File file = inputfile.getSelectedFile();
String fullpath = file.getAbsolutePath();

JPanel myPanel = new JPanel();

myPanel.add(new JLabel("Project Name:"));
myPanel.add(projnameField);

myPanel.add(new JLabel("Number of instances:"));
myPanel.add(nField);

myPanel.add(new JLabel("Number of attributes:"));
myPanel.add(mField);

myPanel.add(new JLabel("Alpha:"));
myPanel.add(alphaField);

myPanel.add(new JLabel("Number of patterns:"));
myPanel.add(kField);

myPanel.add(new JLabel("Please select your datset:"));
myPanel.add(inputfile);

myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.Y_AXIS));

int result = JOptionPane.showConfirmDialog(
    null, myPanel, "CPM Program", JOptionPane.OK_CANCEL_OPTION);

double alpha = Double.parseDouble(alphaField.getText());
int numpat = Integer.parseInt(kField.getText());
int num_inst = Integer.parseInt(nField.getText());
int num_attr = Integer.parseInt(mField.getText());
String projname = (projnameField.getText());

In reference to the above image I have two questions:

  1. Notice the labels are centered. How can I put those in the left side like this:

    Project name:        --textbox--
    Number of instances: --textbox--
    
  2. In the label, "Please select you dataset", I want to browse the file, select it and copy the full path in a blank box in the front of "Please select you dataset" label, but I do not know how I should do it.

like image 820
user2330489 Avatar asked Jan 14 '23 11:01

user2330489


2 Answers

1- The first problem is that all of the labels such as project name or number of instances are centered (it seems!). How can I put those in the left side?

JLabel has a constructor that takes an int as one of the parameters, and you can use it to position your text held in the JLabel.

2- The second problem is that text fields are not in the front of labels and are below of them. I want to have each text field in the front of the label such as:

Layouts are the key here. Consider using GridBagLayout (which can be somewhat difficult to use initially) or MigLayout (easier to use but you have to download it first) to allow use of a more tabular structure for your GUI.

For example, please have a look at my code in this answer for an example of tabular structure using GridBagLayout.

like image 99
Hovercraft Full Of Eels Avatar answered Jan 17 '23 08:01

Hovercraft Full Of Eels


You might use a GroupLayout for that first section. E.G.

enter image description here

import java.awt.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;

class TwoColumnLayout {

    /**
     * Provides a JPanel with two columns (labels & fields) laid out using
     * GroupLayout. The arrays must be of equal size.
     *
     * Typical fields would be single line textual/input components such as
     * JTextField, JPasswordField, JFormattedTextField, JSpinner, JComboBox,
     * JCheckBox.. & the multi-line components wrapped in a JScrollPane -
     * JTextArea or (at a stretch) JList or JTable.
     *
     * @param labels The first column contains labels.
     * @param fields The last column contains fields.
     * @param addMnemonics Add mnemonic by next available letter in label text.
     * @return JComponent A JPanel with two columns of the components provided.
     */
    public static JComponent getTwoColumnLayout(
            JLabel[] labels,
            JComponent[] fields,
            boolean addMnemonics) {
        if (labels.length != fields.length) {
            String s = labels.length + " labels supplied for "
                    + fields.length + " fields!";
            throw new IllegalArgumentException(s);
        }
        JComponent panel = new JPanel();
        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);
        // Turn on automatically adding gaps between components
        layout.setAutoCreateGaps(true);
        // Create a sequential group for the horizontal axis.
        GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
        GroupLayout.Group yLabelGroup = layout.createParallelGroup(GroupLayout.Alignment.TRAILING);
        hGroup.addGroup(yLabelGroup);
        GroupLayout.Group yFieldGroup = layout.createParallelGroup();
        hGroup.addGroup(yFieldGroup);
        layout.setHorizontalGroup(hGroup);
        // Create a sequential group for the vertical axis.
        GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
        layout.setVerticalGroup(vGroup);

        int p = GroupLayout.PREFERRED_SIZE;
        // add the components to the groups
        for (JLabel label : labels) {
            yLabelGroup.addComponent(label);
        }
        for (Component field : fields) {
            yFieldGroup.addComponent(field, p, p, p);
        }
        for (int ii = 0; ii < labels.length; ii++) {
            vGroup.addGroup(layout.createParallelGroup().
                    addComponent(labels[ii]).
                    addComponent(fields[ii], p, p, p));
        }

        if (addMnemonics) {
            addMnemonics(labels, fields);
        }

        return panel;
    }

    private final static void addMnemonics(
            JLabel[] labels,
            JComponent[] fields) {
        Map<Character, Object> m = new HashMap<Character, Object>();
        for (int ii = 0; ii < labels.length; ii++) {
            labels[ii].setLabelFor(fields[ii]);
            String lwr = labels[ii].getText().toLowerCase();
            for (int jj = 0; jj < lwr.length(); jj++) {
                char ch = lwr.charAt(jj);
                if (m.get(ch) == null && Character.isLetterOrDigit(ch)) {
                    m.put(ch, ch);
                    labels[ii].setDisplayedMnemonic(ch);
                    break;
                }
            }
        }
    }

    /**
     * Provides a JPanel with two columns (labels & fields) laid out using
     * GroupLayout. The arrays must be of equal size.
     *
     * @param labelStrings Strings that will be used for labels.
     * @param fields The corresponding fields.
     * @return JComponent A JPanel with two columns of the components provided.
     */
    public static JComponent getTwoColumnLayout(
            String[] labelStrings,
            JComponent[] fields) {
        JLabel[] labels = new JLabel[labelStrings.length];
        for (int ii = 0; ii < labels.length; ii++) {
            labels[ii] = new JLabel(labelStrings[ii]);
        }
        return getTwoColumnLayout(labels, fields);
    }

    /**
     * Provides a JPanel with two columns (labels & fields) laid out using
     * GroupLayout. The arrays must be of equal size.
     *
     * @param labels The first column contains labels.
     * @param fields The last column contains fields.
     * @return JComponent A JPanel with two columns of the components provided.
     */
    public static JComponent getTwoColumnLayout(
            JLabel[] labels,
            JComponent[] fields) {
        return getTwoColumnLayout(labels, fields, true);
    }

    public static String getProperty(String name) {
        return name + ": \t"
                + System.getProperty(name)
                + System.getProperty("line.separator");
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JTextField projnameField = new JTextField(10);
                JTextField nField = new JTextField(5);
                JTextField mField = new JTextField(5);
                JTextField alphaField = new JTextField(5);
                JTextField kField = new JTextField(5);

                JTextField[] components = {
                    projnameField,
                    nField,
                    mField,
                    alphaField,
                    kField
                };

                String[] labels = {
                    "Project Name:",
                    "Number of instances:",
                    "Number of attributes:",
                    "Alpha:",
                    "Number of patterns:"
                };

                JOptionPane.showMessageDialog(null, 
                        getTwoColumnLayout(labels,components));
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}
like image 30
Andrew Thompson Avatar answered Jan 17 '23 06:01

Andrew Thompson