Кнопка и текстовое поле не отображаются в Java

для школы мне пришлось сделать JFrame и внутри этой одной кнопки и двух текстовых полей. Что бы вы ни поместили в Textfield, нужно попасть в textfield two при нажатии кнопки. Я получил код до такой степени, что должен видеть текстовые поля и кнопку при запуске программы. По какой-то причине.

My come so far:

package helloworld;

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

    public class HelloWorld extends JFrame {

        public static void main(String[] args) {

             JFrame frame = new HelloWorld();
             frame.setSize(400, 400);
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setTitle("Hello World Button App");

             JPanel panel = new JPanel();
             frame.setContentPane(panel);
             fram.setVisible(true);
         }
       }

       class panel extends JPanel {

          public JButton btn1 = new JButton("Klick!");
          public JTextField txt1 = new JTextField(10);
          public JTextField txt2 = new JTextField(10);

          public panel() {
               add(btn1);
               add(txt1);
               add(txt2);
            }
          }

мне еще не разрешено публиковать изображения, но я предоставлю ссылку на изображение вниз здесь

I извините, если этот вопрос allready exests, но я не мог найти аналогичный вопрос. Я новичок в программировании, поэтому, пожалуйста, не кричите на меня, когда я что-то забыл или написал что-то не так!

3 ответов


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

вы уже продлен JFrame, поэтому нет смысла вызывать методы с frame.foo() но просто foo() и самое главное JFrame frame = new HelloWorld(), не будет иметь смысла, если вы уже расширили свой класс с JFrame:

enter image description here

import javax.swing.*;

public class HelloWorld extends JFrame{

 public static void main(String[] args) {

          SwingUtilities.invokeLater(new Runnable() {
          public void run() {
          new HelloWorld().setVisible(true);
        }
    });

     }
    public  HelloWorld()
    {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Hello World Button App");

        panel pan= new panel();
        add(pan.panel);
        pack();
        setVisible(true);
    }
   }

   class panel {

      private JButton btn1 = new JButton("Klick!");
      private JTextField txt1 = new JTextField(10);
      private JTextField txt2 = new JTextField(10);
      JPanel panel;
      public panel() {
           panel = new JPanel();
           panel.add(btn1);
           panel.add(txt1);
           panel.add(txt2);
        }
      }

кроме того, вы также можете расширить свой panel класс JPanel :

 public  HelloWorld()
    {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Hello World Button App");

          panel pan= new panel();
         add(pan);
         pack();
         setVisible(true);
    }
   }

   class panel extends JPanel {

      private JButton btn1 = new JButton("Klick!");
      private JTextField txt1 = new JTextField(10);
      private JTextField txt2 = new JTextField(10);

      public panel() {

           add(btn1);
           add(txt1);
           add(txt2);
        }
      }

это потому, что ваше имя класс panel не JPanel

изменить это:

panel panel = new panel();
frame.setContentPane(panel);
frame.setVisible(true);

вы должны попытаться использовать имена для своего класса, которые не так запутаны, и попытаться объявить их в верхнем регистре.

пример:

Class Panel extends JPanel {}

вы объявили класс panel что вы нигде не используете. Пожалуйста, замените строку bwlow:

JPanel panel = new JPanel();

С:

SomePanel panel = new SomePanel();

тогда ваш класс panel становится SomePanel чтобы следовать правильному названию класса.

некоторые мысли, чтобы помочь вам:

  • Назовите свои классы, следуя стилю Java
  • не используйте открытые поля
  • установка макетов на панелях. На этот раз это сработало для вас, поскольку по умолчанию FlowLayout.