repaint () не обновляет JPanel - PullRequest
0 голосов
/ 14 ноября 2018

Итак, я создал программу, в которой есть графический интерфейс, в котором пользователь может вводить параметры для запуска фейерверка, а в центре экрана находится панель, где запуск запуска должен выполняться при нажатии кнопки. Однако в моей программе JPanel не обновляется и ничего не рисуется. Код ниже

//This is the method that build the JPanel in the center for the launch
public JPanel buildCenter() {
    JPanel center=new JPanel();
    center.setBackground(Color.black);
    center.setVisible(true);
    return center;
}


//This is the method the build the GUI, the buttons and such are in the other panels labeled top, west, east, etc.
public void buildGUI(){
    configureSliders();
    configureRadioButtons();
    JFrame frame=new JFrame();
    JPanel panel=new JPanel();
    JPanel top=new JPanel();
    panel.setLayout(new BorderLayout());
    Fireworks.setFont(new Font("Helvetica", Font.BOLD, 30));
    frame.setLayout(new BorderLayout());
    top.setLayout(new BoxLayout(top, BoxLayout.X_AXIS));
    top.add(Box.createHorizontalGlue());
    top.add(Fireworks);
    top.add(Box.createHorizontalGlue());
    frame.add(top, BorderLayout.NORTH);
    frame.add(panel, BorderLayout.CENTER);
    frame.setSize(1920,1080);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    panel.add(buildCenterTop(),BorderLayout.NORTH);
    panel.add(buildCenter(), BorderLayout.CENTER);
    panel.add(buildwest(), BorderLayout.WEST);
    panel.add(buildeast(),BorderLayout.EAST);
    panel.add(Launch, BorderLayout.SOUTH);
    Launch.addActionListener(this);
}
//this is the action performed method where repaint won't work. fire is my fireworks object with the paintcomponent method for the launch.
@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource().equals(Launch)) {
        setColor();
        setTime();
        setExplosion();
        fire.setVelocity(veloslider.getValue());
        fire.setTheta(thetaslider.getValue());
        buildCenter().add(fire);
        buildCenter().repaint();
        buildCenter().validate();

    }

1 Ответ

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

Все, что делает ваш метод buildCenter(), это создает пустую панель с черным фоном.

Затем вы добавляете эту пустую панель в рамку:

panel.add(buildCenter(), BorderLayout.CENTER);

Затем в ActionListener выdo:

buildCenter().add(fire);
buildCenter().repaint();
buildCenter().validate();

Все, что нужно сделать - это создать еще 3 пустые панели.Вы не хотите создавать еще 3 панели.Вы хотите добавить компоненты к существующей панели.

Вам нужно создать отдельный экземпляр вашей «центральной» панели, а затем сохранить переменную, которая ссылается на эту панель, чтобы вы могли обновить панель в будущем..

Итак, вам нужно определить переменную экземпляра в вашем классе:

private JPanel centerPanel;

Затем в методе buildGui () вы создадите панель:

//panel.add(buildCenter(), BorderLayout.CENTER);
centerPanel = buildCenter();
panel.add(buildCenter, BorderLayout.CENTER);

Затем в вашем ActionListener вы можете добавить компоненты на центральную панель:

//buildCenter().add(fire);
//buildCenter().repaint();
//buildCenter().validate();
centerPanel.add( fire );
centerPanel.revalidate();
centerPanel.repaint();
...