Компоненты не отображаются в ContentPane - PullRequest
0 голосов
/ 21 ноября 2018

В моем приложении у меня есть список 6 Jlabels, которые добавляются в contentPane в цикле for.После этого я добавляю 2 JButtons - один для удаления всех этикеток и второй для их добавления:

public class Test {

    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Test window = new Test();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Test() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 960, 620);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.getContentPane().setLayout(null);
        frame.getContentPane().setBackground(new Color(30, 30, 30));


        LinkedList<JLabel> labels = new LinkedList<>();
        for(int i = 0 ; i < 6 ; i++) {
            labels.get(i).setSize(280, 50);
            labels.setBackground(new Color(75, 75, 75));
            labels.setOpaque(true);
        }

        Button buttonAdd = new JButton("Add");
        buttonAdd.setBounds(310, 15, 150, 50);
        buttonAdd.addMouseListener(new MouseAdapter() {
            @Override
            public final void mouseClicked(MouseEvent event) {
                for(int i = 0 ; i < 6 ; i++) {
                    labels.get(i).setLocation(15, 15+50*i);
                    frame.getContentPane().add(labels.get(i));
                }
            }
        });

        Button buttonRemove = new JButton("Remove");
        buttonRemove.setBounds(310, 15, 150, 50);
        buttonRemove.addMouseListener(new MouseAdapter() {
            @Override
            public final void mouseClicked(MouseEvent event) {
                for(int i = 0 ; i < 6 ; i++) {
                    frame.getContentPane().remove(labels.get(i));
                }
            }
        });
    }
}

Когда я добавил 6 этикеток за пределы линстеров, они были правильно добавлены в ContentPane и отображается.Тем не менее, когда я пытаюсь сделать это с помощью кнопок, при нажатии buttonAdd ничего не происходит.Они не отображаются.

Я пытался связываться с иерархией, устанавливая индексы вручную, но ничего не получалось.Я подозреваю, что MouseListeners, но я понятия не имею, почему это не работает.

1 Ответ

0 голосов
/ 21 ноября 2018

Перво-наперво;

- Все, что изменяет графический интерфейс, должно быть сделано в Потоке рассылки событий (EDT). Вы можете прочитать больше, зачем это нужно, из этого ответа.


Вы должны позвонить:

 Test.this.frame.revalidate();
 Test.this.frame.repaint();

Как показано ниже:

           for ( int i = 0; i < 6; i++ )
           {
              final JLabel l = labels.get( i );
                              l.setLocation( 15, 15 + (50 * i) );
              Test.this.frame.getContentPane().add( l );
           }
           Test.this.frame.revalidate();
           Test.this.frame.repaint();

Помимо этого, я вижу в вашем коде, который вы используете Button вместо JButton, я предполагаю, что это просто опечатка.Это должно быть JButton.Также

    for(int i = 0 ; i < 6 ; i++) {
    labels.get(i).setSize(280, 50);
    labels.setBackground(new Color(75, 75, 75));
    labels.setOpaque(true);
    }

этот фрагмент кода просто неверен, метки - это list, а не JLabel.Определить локальную переменную

JLabel labelToAdd = labels.get(i)
labelToAdd.setSize(280, 50);
labelToAdd.setBackground(new Color(75, 75, 75));
labelToAdd.setOpaque(true);
...