我怎样才能一起使用JTextField和JLabel?

时间:2016-12-24 16:24:22

标签: java swing jpanel jlabel jtextfield

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

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

1 个答案:

答案 0 :(得分:3)

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

根据您尝试实现的目标,可以采用多种方法解决此问题:

  • 给JLabel一个布局管理器,然后将JTextField添加到它:但是JTextField 覆盖 JLabel,它的文本(如果有的话)及其图标(如果有的话) ,不好。
  • 创建一个JPanel来保存两者,并给它一个合适的布局管理器:可能是一个不错的选择。
  • 使用布局管理器将它们添加到同一个JPanel中,布局管理器可以轻松地将它们关联起来:另一个不错的选择。 GridBagLayout适用于此。

根据JLabel Tutorial

,请不要忘记调用JLabel的setLabelFor(...)方法将其与JTextField紧密关联

例如:

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

}

显示为

enter image description here

请注意,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);