如何一起使用 JTextField 和 JLabel?

how can I use JTextField and JLabel together?

我需要标签上的文本字段,但是当我 运行 此代码时,屏幕上没有文本字段。我该如何解决它。

JFrame jf = new JFrame() ;

JPanel panel = new JPanel() ;

JLabel label = new JLabel() ;

JTextField tField = new JTextField("asd" , 10) ;

label.add( tField ) ;
panel.add( label ) ;

jf.setSize( 500,400 ) ;
jf.add( panel ) ;
jf.setVisible(true) ;

JLabel 没有默认的布局管理器,因此当您的 JTextField 添加到 JLabel 时,它没有显示,因为标签不知道如何 来显示它。

根据您要实现的目标,可以通过多种方式解决此问题:

  • 为 JLabel 提供布局管理器,然后将 JTextField 添加到其中:但随后 JTextField 覆盖 JLabel、其文本(如果有)及其图标 (如果有的话),不好。
  • 创建一个 JPanel 来容纳两者,并为其提供适当的布局管理器:可能是一个不错的选择。
  • 将它们添加到同一个 JPanel,使用可以轻松将它们关联起来的布局管理器:另一个不错的选择。 GridBagLayout 对此效果很好。

别忘了调用 JLabel 的 setLabelFor(...) 方法将其与 JTextField 紧密关联,按照 JLabel Tutorial

例如:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;

public class GridBagEg {
    private static void createAndShowGui() {
        PlayerEditorPanel playerEditorPane = new PlayerEditorPanel();

        int result = JOptionPane.showConfirmDialog(null, playerEditorPane, "Edit Player",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
        if (result == JOptionPane.OK_OPTION) {
            // TODO: do something with info

            for (PlayerEditorPanel.FieldTitle fieldTitle : PlayerEditorPanel.FieldTitle.values()) {
                System.out.printf("%10s: %s%n", fieldTitle.getTitle(),
                        playerEditorPane.getFieldText(fieldTitle));
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

@SuppressWarnings("serial")
class PlayerEditorPanel extends JPanel {
    enum FieldTitle {
        NAME("Name", KeyEvent.VK_N), SPEED("Speed", KeyEvent.VK_P), STRENGTH("Strength", KeyEvent.VK_T);
        private String title;
        private int mnemonic;

        private FieldTitle(String title, int mnemonic) {
            this.title = title;
            this.mnemonic = mnemonic;
        }

        public String getTitle() {
            return title;
        }

        public int getMnemonic() {
            return mnemonic;
        }
    };

    private static final Insets WEST_INSETS = new Insets(5, 0, 5, 5);
    private static final Insets EAST_INSETS = new Insets(5, 5, 5, 0);
    private Map<FieldTitle, JTextField> fieldMap = new HashMap<FieldTitle, JTextField>();

    public PlayerEditorPanel() {
        setLayout(new GridBagLayout());
        setBorder(BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Player Editor"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));
        GridBagConstraints gbc;
        for (int i = 0; i < FieldTitle.values().length; i++) {
            FieldTitle fieldTitle = FieldTitle.values()[i];
            JLabel label = new JLabel(fieldTitle.getTitle() + ":", JLabel.LEFT);
            JTextField textField = new JTextField(10);
            label.setDisplayedMnemonic(fieldTitle.getMnemonic());
            label.setLabelFor(textField);
            gbc = createGbc(0, i);
            add(label, gbc);
            gbc = createGbc(1, i);
            add(textField, gbc);

            fieldMap.put(fieldTitle, textField);
        }
    }

    private GridBagConstraints createGbc(int x, int y) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;

        gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST;
        gbc.fill = (x == 0) ? GridBagConstraints.BOTH : GridBagConstraints.HORIZONTAL;

        gbc.insets = (x == 0) ? WEST_INSETS : EAST_INSETS;
        gbc.weightx = (x == 0) ? 0.1 : 1.0;
        gbc.weighty = 1.0;
        return gbc;
    }

    public String getFieldText(FieldTitle fieldTitle) {
        return fieldMap.get(fieldTitle).getText();
    }

}

显示为

请注意,JLabel 在助记字符上有下划线,当按下 alt 键组合时,这些字符会将焦点带到 JLabel 通过 setLabelFor(...) 链接到的 JTextField,并且由此引起代码:

FieldTitle fieldTitle = FieldTitle.values()[i]; // an enum that holds label texts
JLabel label = new JLabel(fieldTitle.getTitle() + ":", JLabel.LEFT); // create JLabel
JTextField textField = new JTextField(10);  // create JTextField

// set the label's mnemonic -- brings focus to the linked text field
label.setDisplayedMnemonic(fieldTitle.getMnemonic());   

// *** here we *link* the JLabel with the JTextField
label.setLabelFor(textField);