有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我怎样才能同时使用JTextField和JLabel?

我需要一个标签上的文本字段,但当我运行此代码时,屏幕上没有文本字段。我该怎么修呢

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) 个答案

  1. # 1 楼答案

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

    显示为

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