Массив JLabels не будет отображаться - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь создать графический интерфейс с панелью заголовка, панелью информационного раздела (InfoSect), а затем и панелью, где пользователь будет вводить и изменять значения в информационном разделе.Прямо сейчас я застрял на том, чтобы просто пытаться заставить панели отображаться.Я продолжаю получать ошибки для панели InfoSect, где у меня есть массив JLabels.Я думаю, что я инициализирую неправильно, но я не уверен, как или почему.Кажется, это также влияет на отображение более простой панели заголовка.Был бы признателен за помощь в отображении этой панели в графическом интерфейсе.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GUI extends JFrame{

    private JPanel main;
    Title tle1;
    InfoSect is;

    public GUI() {  
        main = new JPanel();
        tle1 = new Title();
        is = new InfoSect();

        main.setLayout(new BorderLayout());
        main.setBackground(Color.GRAY);

        add(main);
        main.add(tle1, BorderLayout.NORTH);
        main.add(is, BorderLayout.CENTER);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(900,700);
        setVisible(true);
    }

    public static class Title extends JPanel{
        private JLabel title;

        public Title() {
            title = new JLabel("Change the Values");
            setLayout(new FlowLayout());
            add(title);
        }
    }

    public static class InfoSect extends JPanel{

        private JLabel[] info;
        private int COL = 4;

        public InfoSect() {
            info = new JLabel[COL];
            setLayout(new FlowLayout());
            displayInfo();
            add(info[COL]);
        }

        public void displayInfo() {
            for(int col=0;col<COL;col++) {
                Font font1 = new Font(Font.SANS_SERIF,Font.PLAIN,10);
                info[col].setFont(font1);
                info[col].setText("Holder");
                add(info[col]);
            }
        }
    }

}

Исключение составляет:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at build001.GUI$InfoSect.displayInfo(GUI.java:59) 
at build001.GUI$InfoSect.<init>(GUI.java:52) 
at build001.GUI.<init>(GUI.java:20) 

1 Ответ

0 голосов
/ 26 декабря 2018

Ваша проблема с этой программой - с массивом JLabel[] info

info = new JLabel[COL];

Эта строка будет только инициализировать ваш массив JLabel, но не каждый JLabel.

, так что вы можете изменить свойdisplayInfo() функция, как показано ниже, для индивидуальной инициализации JLabel.

public void displayInfo() {
        for(int col=0;col<COL;col++) {
            Font font1 = new Font(Font.SANS_SERIF,Font.PLAIN,10);
            info[col] = new JLabel();
            info[col].setFont(font1);
            info[col].setText("Holder");
            add(info[col]);
        }
}

Существует также еще одна проблема с кодом в функции infoSect(), когда вы добавляете сразу весь массив JLabel, записывая add(info[COL]) но вы не можете добавить весь массив, как этот, поэтому вы можете удалить эту строку, потому что вы уже добавляете каждый JLabel в другую функцию displayInfo() в add(info[col]).

Это может работать для того, что вы хотите сделать.

...