как создать JPanels в массиве и добавить к нему Jlabels? - PullRequest
0 голосов
/ 02 января 2012

Я смотрел на многих сайтах.Без панелей метки отображаются правильно, с панелями выдается ошибка:

Exception in thread "main" java.lang.NullPointerException   

, что я могу сделать, чтобы это исправить?

вот исходный код:

JLabel button[] = new JLabel[100];
JPanel[] panel = new JPanel[100];

    for (int i = 0; i < button.length; i++) {
        a = a + 50;

        if (a > 549) {
            b = b + 50;
            a = 50;
        }
        button[i] = new JLabel("hi");
        frame.add(button[i]);    //is this necessary? 
        button[i].setVisible(true); // is this necessary?
        button[i].setSize(50,50);
        panel[i].add(button[i]);
        panel[i].setVisible(true);
        panel[i].setBounds(a, b, 50, 50);
        frame.add(panel[i]);

    }

Что не так с этим, как я могу это исправить?просто чтобы вы знали, у него должно быть 100 ярлыков с надписью hi в массиве 10 на 10.Вот как это выглядит: this is what it looks like

Ответы [ 2 ]

5 голосов
/ 02 января 2012

Создание массива JPanel создает только массив. Он не создает JPanel для заполнения массива. Таким образом, массивы заполнены null с. Вы должны создать JPanel для каждого элемента массива:

panel[i] = new JPanel();
panel[i].add(button[i]);

Кроме того, компонент может иметь только одного предка. Кнопка должна быть добавлена ​​в рамку или на панель, но не в обе. Если вы хотите кнопку на панели, она должна быть добавлена ​​на панель.

Компоненты видимы по умолчанию (кроме элементов верхнего уровня, таких как фреймы или диалоговые окна, которые должны быть сделаны видимыми). Вам не нужно звонить button.setVisible(true).

Вы должны определенно научиться использовать менеджеры компоновки, а не устанавливать размер и границы ваших компонентов явно. Это единственный способ иметь красивые, портативные приложения с графическим интерфейсом. Читать http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

3 голосов
/ 02 января 2012

не использовать frame.setLayout(null); использовать frame.setLayout (новый GridLayout (10,10,10,10)); вместо, например

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

public class CustomComponent1 extends JFrame {

    private static final long serialVersionUID = 1L;

    public CustomComponent1() {
        setTitle("Custom Component Test / GridLayout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void display() {
        setLayout(new GridLayout(10, 10, 10, 10));
        for (int row = 0; row < 100; row++) {
            add(new CustomComponents1());
        }
        //pack();
        // enforces the minimum size of both frame and component
        setMinimumSize(getMinimumSize());
        setPreferredSize(getPreferredSize());
        setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                CustomComponent1 main = new CustomComponent1();
                main.display();
            }
        };
        javax.swing.SwingUtilities.invokeLater(r);
    }
}

class CustomComponents1 extends JLabel {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(20, 20);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(20, 20);
    }

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}
...