Adding container's parent to itself

144
03 апреля 2019, 08:40

Имеется следующий код:

package com.company;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main {
    private static JLabel portText = new JLabel("Port:");
    private static JLabel brokerAddressText = new JLabel("Broker ip address:");
    private static JLabel topicText = new JLabel("Topic");
    private static JLabel messageText = new JLabel("Message:");
    private static JTextField port = new JTextField(4);
    private static JTextField brokerAddress = new JTextField(10);
    private static JTextField topic = new JTextField(10);
    private static JTextField message = new JTextField(20);
    private static JButton connect = new JButton("Connect");
    private static JButton disconnect = new JButton("Disconnect");
    private static JButton subscribe = new JButton("Subscribe");
    private static JButton unsubscribe = new JButton("Unsubscribe");
    private static JButton publish = new JButton("Publish");
    private static int iPort;
    private static String sIp;
    public static void main(String[] args) {
        JFrame jFrame = getFrame();
        connect.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try{
                    iPort = Integer.parseInt(port.getText());
                    sIp = brokerAddress.getText();
                }catch (NumberFormatException exc){
                    System.out.println("Wrong port input");
                }
            }
        });

    }
    private static JFrame getFrame(){
        JFrame jFrame = new JFrame();
        JPanel jPanel = (JPanel) jFrame.getContentPane();
        jFrame.setVisible(true);
        jFrame.setBounds(750,250,500,500);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.add(jPanel);
        jFrame.setTitle("MQTT client");
        portText.setLocation(10,10);
        jPanel.add(portText);
        port.setLocation(10,30);
        jPanel.add(port);
        jPanel.add(brokerAddressText);
        jPanel.add(brokerAddress);
        jPanel.add(connect);
        jPanel.add(disconnect);
        jPanel.add(topicText);
        jPanel.add(topic);
        jPanel.add(subscribe);
        jPanel.add(unsubscribe);
        jPanel.add(messageText);
        jPanel.add(message);
        jPanel.add(publish);
        jPanel.revalidate();
        return jFrame;
    }
}

При компиляции выдает ошибку:

Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself at java.desktop/java.awt.Container.checkAddToSelf(Container.java:497) at java.desktop/java.awt.Container.addImpl(Container.java:1110) at java.desktop/java.awt.Container.add(Container.java:1025) at java.desktop/javax.swing.JFrame.addImpl(JFrame.java:553) at java.desktop/java.awt.Container.add(Container.java:432) at com.company.Main.getFrame(Main.java:50) at com.company.Main.main(Main.java:26)

Понимаю, что скорее всего это из-за строк

JPanel jPanel = (JPanel) jFrame.getContentPane();
jFrame.add(jPanel);

Но в таком случае, не понимаю, как добавить панельку тогда

Answer 1

Лучше всего для JFrame создавать отдельный класс с удобным конструктором:

public class Main {
  public static void main(String[] args) {
    MyFrame frame = new MyFrame();
  }
}
class MyFrame extends JFrame {
  MyFrame() {
  }
}

Теперь можно указать основные настройки в конструкторе:

setVisible(); лучше всего ставить самым последним;

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

название title (super) лучше всего в самом начале конструктора

class MyFrame extends JFrame {
  MyFrame() {
    super("MQTT client");

    setBounds(400,400,400,400);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setVisible(true);
  }
}

теперь панель и layout (расположение) основных элементов интерфейса (кнопки и строки тд)

GridLayout,BoxLayout,GroupLayout,BorderLayout,CardLayout и другие

в GridLayout элементы распалогаються в сетке 3 на 3

  MyFrame() {
    super("MQTT client");
    JPanel jPanel = new JPanel();
    getContentPane().add(jPanel);
    jPanel.setLayout(new GridLayout(3,3));

    setBounds(400,400,400,400);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setVisible(true);
  }
}

теперь можно создавать всё остальное

package com.company;
import javax.swing.*;
import java.awt.*;
public class Main {
  public static void main(String[] args) {
    MyFrame frame = new MyFrame();
  }
}
class MyFrame extends JFrame {
  private static JLabel portText = new JLabel("Port:");
  private static JLabel brokerAddressText = new JLabel("Broker ip address:");
  private static JLabel topicText = new JLabel("Topic");
  private static JLabel messageText = new JLabel("Message:");
  private static JTextField port = new JTextField(4);
  private static JTextField brokerAddress = new JTextField(10);
  private static JTextField topic = new JTextField(10);
  private static JTextField message = new JTextField(20);
  private static JButton connect = new JButton("Connect");
  private static JButton disconnect = new JButton("Disconnect");
  private static JButton subscribe = new JButton("Subscribe");
  private static JButton unsubscribe = new JButton("Unsubscribe");
  private static JButton publish = new JButton("Publish");

  MyFrame() {
    super("MQTT client");
    JPanel jPanel = new JPanel();
    getContentPane().add(jPanel);
    jPanel.setLayout(new GridLayout(3,3));
    jPanel.add(portText);
    jPanel.add(port);
    jPanel.add(brokerAddressText);
    jPanel.add(brokerAddress);
    jPanel.add(connect);
    jPanel.add(disconnect);
    jPanel.add(topicText);
    jPanel.add(topic);
    jPanel.add(subscribe);
    jPanel.add(unsubscribe);
    jPanel.add(messageText);
    jPanel.add(message);
    jPanel.add(publish);
    setBounds(400,400,400,400);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setVisible(true);
  }
}

теперь осталось только настроить их местоположение вот видео о том как это сделать в gridLayout

https://www.youtube.com/watch?v=3cuVqLxNBbc

READ ALSO
Зачем нужны аннотации в Spring?

Зачем нужны аннотации в Spring?

Начал разбираться с этим фреймворком и хотелось бы узнать вот что:

160
TensorFlow - создание модели для обучения (.pb) распознавания речи и преобразования в текст

TensorFlow - создание модели для обучения (.pb) распознавания речи и преобразования в текст

помогите пожалуйста разобраться с TensorFlowМне нужно создать Android приложение для распознавания команд управления, но сделать это нужно с использованием...

151
Formatter не работает через сокеты

Formatter не работает через сокеты

Если создать Formatter из сокетного OutputStream-a, тоformat() не отрабатывает как ожидается:

183
SpringLiquibase работа с ресурсами

SpringLiquibase работа с ресурсами

В моем проекте есть тестовый модуль, и модули-pojo с hibernate entity классами

189