Простое добавление JLabel в JPanel - PullRequest
4 голосов
/ 13 мая 2011

У меня простая проблема, так как я не очень хорошо знаком с 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);
    }
}

Ответы [ 5 ]

19 голосов
/ 13 мая 2011

Вы забыли добавить панель 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 всегда будет содержать значение «add JLabel». Если вы хотите увидеть «Имя пользователя», используйте add(lab1); вместо add(lab1 = new JLabel("add JLabel"));.

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

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

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

2 голосов
/ 13 мая 2011

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

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 голосов
/ 13 мая 2011

Используемый вами конструктор не является правильным конструктором. Конструктор Java не имеет возвращаемого типа, а void является дополнительным. Когда в методе main вы вызываете new 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);, в противном случае панель все еще не добавлена.

0 голосов
/ 22 июня 2017

@ SuppressWarnings ("serial") открытый класс 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 голосов
/ 13 мая 2011

Образец Jpanel.

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

просто бросьте JPanel p и все ваши "p." S

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...