Вопрос: Простое добавление JLabel в JPanel


У меня простая проблема, так как я не очень хорошо знаком с Java GUI. Я пытаюсь сделать видимым JLable на приведенном ниже коде, поскольку мне трудно понять концепцию. Но метка еще не видна, но кадр открывается во время выполнения.

public class Sample extends JPanel {

    public void Sample() {
        JPanel p = new JPanel();

        JLabel lab1 = new JLabel("User Name", JLabel.LEFT);
        p.setLayout(new FlowLayout());
        p.add(lab1 = new JLabel("add JLabel"));
    }

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.getContentPane().add(new Sample());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
    }
}

4


источник


Ответы:


Вы забыли добавить панель p к образцу. Либо используйте add(p) в конце или просто удалить панель p потому что ваш образец класса расширяет JPanel.

Опция 1:

    JPanel p = new JPanel();

    JLabel lab1 = new JLabel("User Name", JLabel.LEFT);
    p.setLayout(new FlowLayout()); 
    p.add(lab1 = new JLabel("add JLabel"));
    add(p);

вариант 2:

    JLabel lab1 = new JLabel("User Name", JLabel.LEFT);
    setLayout(new FlowLayout()); 
    add(lab1 = new JLabel("add JLabel"));

Также почему вы переопределяете инициализацию JLabel? В вашем коде JLable всегда будет содержать значение «добавить JLabel». Если вы хотите увидеть «Имя пользователя», используйте это add(lab1); вместо add(lab1 = new JLabel("add JLabel"));,

Может быть, вы просто требуете этого:

    JLabel lab1 = new JLabel("User Name", JLabel.LEFT);
    setLayout(new FlowLayout()); 
    add(lab1);

Также конструктор не может иметь тип возврата, поэтому удалите void из вашего конструктора.


19



Конструктор, который вы используете, не является надлежащим конструктором. Конструктор java не имеет типа возврата и void это дополнительно. Когда в основном методе вы вызываете новый Sample (), он фактически не вызывает ваш метод, а конструктор по умолчанию, который существует по умолчанию.

Попробуй вот так ..

public Sample() {
    JPanel p = new JPanel();

    JLabel lab1 = new JLabel("User Name", JLabel.LEFT);
    p.setLayout(new FlowLayout());
    p.add(lab1 = new JLabel("add JLabel"));
}

также вам нужно сделать то, что @Harry Joy предложило добавить add(p); иначе панель не будет добавлена.


2



Обратите внимание на комментарии.

import java.awt.*;
import javax.swing.*;

public class Sample extends JPanel {

    public Sample() {
        // set the layout in the constructor
        super(new FlowLayout(FlowLayout.LEADING));

        // best not to set size OR preferred size!
        setPreferredSize( new Dimension(200,200) );

        JLabel lab1 = new JLabel("User Name");
        add(lab1);
    }

    public static void main(String[] args) {
        // construct the GUI on the EDT
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JFrame frame = new JFrame("User Details");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                frame.getContentPane().add(new Sample());
                // important!
                frame.pack();

                frame.setVisible(true);
            }
        });
    }
}

Обратите также внимание на то, что, как правило, не рекомендуется распространять компонент без добавления пользовательских функций. Это означало бы (например) определение новых методов для Sample панели (что может быть лучше обозначено как UserDetails или UserDetailsContainer если я правильно понял, где вы собираетесь с этим кодом ..). Или это может быть Login компонент..


2



Образец - это Jpanel.

Пример расширяет JPanel означает, что вы наследуете JPanel.

просто снимите JPanel p и все ваши "p." s


0



@SuppressWarnings ( "последовательный") открытый класс MyGui расширяет JFrame {

private MyContentPane myContentPane = new MyContentPane(); 

public MyGui(){
    super("title");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setContentPane(myContentPane);

    this.createMenu();

    this.pack();
    this.setVisible(true);      
}

private void createMenu(){
    JMenuBar myMenuBar = new JMenuBar();

    JMenu xMenu = new JMenu("x");
    JMenu x = new JMenu("x");

    JMenuItem xItem = new JMenuItem("letter");

    JMenuItem exitItem = new JMenuItem("exit");

    xItem.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            myContentPane.xPanel();
        }
    });
    xItem.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            myContentPane.setxPanel();
        }
    });

    exitItem.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    });

    displayMenu.add(letterItem);
    displayMenu.add(colorItem);

    fileMenu.add(exitItem);

    myMenuBar.add(displayMenu);
    myMenuBar.add(fileMenu);

    this.setJMenuBar(myMenuBar);
}

}


0