Java Проблема метода repaint (). Перекрашивание JPanel приведет к исчезновению окрашенных компонентов в JFrame - PullRequest
1 голос
/ 07 февраля 2020

Я создал отдельный класс для JFrame и JPanel, затем нарисовал (fillOval в классе JFrame) и draw (fillOval в классе JPanel) и кнопку, которая будет просто анимировать компоненты JPanel. Но проблема в том, что всякий раз, когда я перекрашиваю класс JPanel; ---- Компоненты JFrame исчезли. Я не понимаю, почему это происходит. Я хочу, чтобы компонент JFrame был постоянным для каждой анимации, выполненной в классе JPanel.

Пример кода:

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

public class TryRepaintIssue extends JFrame
{
    public TryRepaintIssue(){
       thePanel panel = new thePanel();
       add(panel);
       setSize(1000,1000);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setVisible(true);
    }

    public void paint(Graphics g){
        super.paint(g);
        g.fillOval(100,500,100,100);
    }
    public static void main(String[] args){
        new TryRepaintIssue();
    }

    public static class thePanel extends JPanel{
        private int y = 100, vector = 1;
        public thePanel(){
            JButton button = new JButton("Play");
            button.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    y += vector;
                    repaint();
                }
            });
            add(button);
        }
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.red);
            g2.fillOval(100,y,100,100);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Компоненты JFrame исчезли.

Компоненты не исчезают. Кнопка и панель по-прежнему отображаются.

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

Я не понимаю, почему это происходит

Метод paint () фрейма отвечает за рисование всех дочерних компонентов фрейма. Таким образом, он перерисовывает JPanel, который вы добавляете в рамку, который, в свою очередь, рисует кнопку JButton, которую вы добавляете на панель.

Затем закрашивает черный круг в верхней части панели.

Когда вы нажимаете кнопка, которую вы перерисовываете только "панель", которая заставляет JButton и красный круг быть нарисованным

Вы теряете рисунок черного круга, потому что больше не вызываете код для рисования этого круга.

Если вы хотите, чтобы черный круг остался, у вас есть несколько вариантов:

  1. Лучшее решение - НЕ перекрывать краску () на раме. Вместо этого сделайте всю пользовательскую живопись в своей панели. Так что нарисуйте черные и красные круги.

  2. перекрасить весь кадр в коде ActionListener:

    //repaint();
    SwingUtilities.windowForComponent(button).repaint();
    
  3. использовать стеклянную панель, как предложено в ответе Тома.

1 голос
/ 07 февраля 2020

Вы не должны переопределять JFrame.paint, особенно без вызова super. Обычно рисование в этих ситуациях выполняется на стеклянной панели .

...