Мой JPanel не появится. Затмение говорит, что у меня нет ошибок. Ява


Я пытаюсь отобразить JPanel в JFrame. Jrame работает, но я не могу получить JPanel для отображения.

Сегодня весь мой класс потратил на это целый час. Включая учителя. Не повезло. Затмение говорит, что нет никаких ошибок может кто-то, пожалуйста, предупредить меня о моей ошибке?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// make a JFrame and bits

public class MySystemGUI extends JFrame implements ActionListener
{
    private static final long serialVersionUID = 1L;
    private JFrame myFrame;
    private JTextField LLName, LLAddress, LLPhone, LLbankDeets;
    private JButton sub1;
    private JLabel LLNameT, LLAddressT, LLPhoneT, LLbankDeetsT;

    private JPanel LLJP()
    {
        JPanel JP1 = new JPanel();

        LLNameT = new JLabel ("Enter Landlord name");
        LLName = new JTextField(30);
        LLAddressT = new JLabel ("Enter Landlord Address ");
        LLAddress = new JTextField(40);
        LLPhoneT = new JLabel ("Enter Landlod Phone No.");
        LLPhone = new JTextField(10);
        LLbankDeetsT = new JLabel ("Enter Landlod Bank details");
        LLbankDeets = new JTextField(10);
        sub1 = new JButton("Submit"); 

        JP1.add(LLNameT);
        JP1.add(LLName); 
        JP1.add(LLAddressT);
        JP1.add(LLAddress); 
        JP1.add(LLPhoneT);
        JP1.add(LLPhone); 
        JP1.add(LLbankDeetsT );
        JP1.add(LLbankDeets); 
        JP1.add(sub1);

        //myFrame.add(JP1 );

        return JP1;
    }

    // Set up frame 

    public MySystemGUI()
    {   
        myFrame = new JFrame ();
        JPanel myPanel = LLJP(); 
        myFrame.add(myPanel,"South");
        this.setLayout(new GridBagLayout());
        this.setSize(700, 500);
        this.setTitle("My System GUI");
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBackground(Color.blue);  
    }

    //run this bitch
    public static void main (String[] args)
    { 
        new MySystemGUI();
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {

    }
}
2 2

2 ответа:

У вас есть член JFrame

private JFrame myFrame;

Это то, к чему вы добавляете компоненты.

myFrame.add(myPanel,"South");

Но вы задаете видимый фрейм класса

public class MySystemGUI extends JFrame
   ...
   this.setVisible(true);   // `this` is class frame, not `myFrame`

Вынуть все this.setXxx и сделать myFrame.setXxx, и вынуть extends JFrame

public class MySystemGUI implements ActionListener {
    ...
    public MySystemGUI() {
       ...
       myFrame.setLayout(new GridBagLayout());
       myFrame.setSize(700, 500);
       myFrame.setTitle("My System GUI");
       myFrame.setVisible(true);
       ...
    }
}

Другие Примечания

  • myFrame.add(myPanel,"South"); - "Юг" не имеет значения, только для пограничников. Вы устанавливаете макет в GridBaglayout.

  • this.setBackground(Color.blue); не хотите ли вы установить фон после рамка видна?

  • Программы Swing должны выполняться / запускаться в потоке отправки событий. СмотритеНачальные Потоки . В принципе, вы можете обернуть экземпляр в SwingUtilities.invokeLater

    public static void main (String[] args) { 
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new MySystemGUI();
            }
        });
    }
    

Обновить

Вы также захотите использовать различные менеджеры компоновки для панели, содержащей метки и поле. С FlowLayout (по умолчанию JPanel), eveerytyhing добавляется последовательно в строке. Потратьте некоторое время, чтобы изучить менеджеры по компоновке при размещении компонентов в контейнере

Вот простое исправление с помощью GridLayout

import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class MySystemGUI implements ActionListener {

    private static final long serialVersionUID = 1L;
    private JFrame myFrame;
    private JTextField LLName, LLAddress, LLPhone, LLbankDeets;
    private JButton sub1;
    private JLabel LLNameT, LLAddressT, LLPhoneT, LLbankDeetsT;

    private JPanel LLJP() {

        JPanel JP1 = new JPanel(new GridLayout(0, 2));

        LLNameT = new JLabel("Enter Landlord name");
        LLName = new JTextField(30);
        LLAddressT = new JLabel("Enter Landlord Address ");
        LLAddress = new JTextField(40);
        LLPhoneT = new JLabel("Enter Landlod Phone No.");
        LLPhone = new JTextField(10);
        LLbankDeetsT = new JLabel("Enter Landlod Bank details");
        LLbankDeets = new JTextField(10);
        sub1 = new JButton("Submit");

        JP1.add(LLNameT);
        JP1.add(LLName);
        JP1.add(LLAddressT);
        JP1.add(LLAddress);
        JP1.add(LLPhoneT);
        JP1.add(LLPhone);
        JP1.add(LLbankDeetsT);
        JP1.add(LLbankDeets);
        JP1.add(sub1);

        return JP1;

    }

    public MySystemGUI() {
        myFrame = new JFrame();
        JPanel myPanel = LLJP();
        myFrame.add(myPanel);
        myFrame.setTitle("My System GUI");
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.setBackground(Color.blue);
        myFrame.pack();
        myFrame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MySystemGUI();
            }
        });
    }

    @Override
    public void actionPerformed(ActionEvent e){}
}

У вас есть локальный фрейм, скрывающий ваш класс, который на самом деле является JFrame:

public class MySystemGUI extends JFrame implements ActionListener {   // class signature
    ...
    public MySystemGUI() {
        ... 
        myFrame = new JFrame (); // local variable
        ...
        myFrame.add(myPanel,"South");
        ...
    }
    ...
}

Ваша панель будет добавлена в этот локальный фрейм вместо вашего класса, так что она не будет видна. Вы можете либо избавиться от этой локальной переменной и добавить панель с помощью this.add(...), либо отказаться от расширения JFrame и вместо этого использовать локальные переменные. Этот последний фокусом предпочтительнее:

Сегодня весь мой класс потратил на это целый час. Включая учителя. Нет удача.
Просто найдите другого учителя.