4

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.

4

2 回答 2

5

1-第一个问题是项目名称或实例数等所有标签都居中(似乎!)。我怎样才能把它们放在左边?

JLabel 有一个将 int 作为参数之一的构造函数,您可以使用它来定位 JLabel 中保存的文本。

2-第二个问题是文本字段不在标签的前面,而是在标签的下面。我希望每个文本字段都位于标签的前面,例如:

布局是这里的关键。考虑使用 GridBagLayout(最初可能有点难以使用)或 MigLayout(更容易使用,但您必须先下载它)以允许为您的 GUI 使用更多表格结构。

例如,请查看我在此答案中的代码,以获取使用 GridBagLayout 的表格结构示例。

于 2013-05-02T23:43:31.620 回答
4

您可以将 aGroupLayout用于第一部分。例如

在此处输入图像描述

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);
    }
}
于 2013-05-03T07:02:21.520 回答