Java GUI,组织一个对话框以从用户获取数据

我正在为我的研究项目设计一个GUI。 我想创建一个从用户获取信息的对话框。 这是截图:

当前状态的图像

以下是截图的代码:

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()); 

在参考上面的图像时,我有两个问题:

  1. 请注意标签居中。 我怎样才能把这些放在左侧:

     Project name: --textbox-- Number of instances: --textbox-- 
  2. 在标签“请选择您的数据集”中,我想浏览文件,选择它并在“请选择您的数据集”标签前面的空白框中复制完整路径,但我不知道该怎么做它。

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

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

2-第二个问题是文本字段不在标签的前面并且在它们下面。 我希望在标签的前面有每个文本字段,例如:

布局是关键。 考虑使用GridBagLayout(最初可能有些难以使用)或MigLayout(更易于使用但必须先下载)以允许为GUI使用更多表格结构。

例如,请查看本答案中的代码,了解使用GridBagLayout的表格结构示例。

您可以在第一部分使用GroupLayout 。 例如

在此处输入图像描述

 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 m = new HashMap(); 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); } }