Java - Почему мои кнопки не отображаются на панели? - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь выучить Java Swing.Сейчас я делаю простую программу, и мне нужно сделать кнопку.У меня есть два класса: водитель и свинг.Я создаю кнопку и импортирую javax.swing.JButton и добавил кнопку.Наконец, кнопка добавлена ​​в панель, но Idk, почему я просто получить панель?Кто-нибудь может мне помочь?Вот мой код:

 import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;

public class Swing extends JFrame {

    private JFrame f;
    private JButton button;
    private JLabel label;
    private JPanel panel; 

    public Swing() {
    }

    public Swing(String titleName) {
        creatButton();
        creatFrame(titleName);
    }

    public void creatButton() {
        JButton btn = new JButton("click me");
        JPanel panel = new JPanel();
        panel.add(btn);
        btn.setBounds(50, 100, 95, 30);
        add(panel);

    }

    private void creatFrame(String title) {
        JFrame f = new JFrame(title);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.setSize(400, 500);
        f.setLayout(null);

    }

}
public class Driver {
    public static void main (String [] args) {
        new Swing ("calculator");
    }

}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Хорошо, давайте начнем с ...

JButton btn = new JButton("click me");
JPanel panel = new JPanel();
panel.add(btn);
btn.setBounds(50, 100, 95, 30);
add(panel);

Вы:

  • Создать кнопку
  • Создать панель
  • ВыДобавить кнопку на панель
  • Вы добавляете панель к рамке

А потом ...

JFrame f = new JFrame("calculator");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new 
f.setVisible(true);

Вы создаете новый экземпляр JFrame и покажи это, но это ничего не значит ?!?!

Вместо этого вам следует избегать расширения от JFrame и, возможно, использовать вместо него JPanel, что-то вроде ...

public class Swing extends JPanel {

    private JButton button;
    private JLabel label;

    public Swing() {
        creatButton();
        add(button);
    }

    public void creatButton() {
        JButton btn = new JButton("click me");
    }
}

Тогда вы можете просто создать окно (или другоеконтейнер) и добавьте его к нему

JFrame f = new JFrame(title);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new Swing());
f.pack(); 
f.setLocationRelativeTo(null);
f.setVisible(true);

Как правило, JFrame является действительно плохой точкой расширения, это сложный, составной компонент, который блокирует вас в одном случае использования.Как правило, лучше начинать с чего-то JPanel, которое предоставляет вам гораздо большую гибкость и намного меньшую сложность, и его легко использовать повторно.

Вам действительно очень нужно избегать null макетов

0 голосов
/ 11 сентября 2018

creatFrame создает новый JFrame, отличный от самого фрейма (ваш класс Swing, расширяющий JFrame).

Удалите строку:

JFrame f = new JFrame(title);

и вызовите методы через this вместо f.

...