Переопределенная функция paint () в подклассе JPanel никогда не вызывалась?


У меня возникла проблема с переопределением метода paint() в моем подклассе JPanel, ChordEditor. Даже когда я переопределяю метод paint (), добавляю его в рамку и вызываю repaint (), метод paint () никогда не вызывается. Распечатка "ввод функции paint" не печатается. Может ли кто-нибудь помочь мне с этим?

Мой класс ChordEditor:

public class ChordEditor extends JPanel{

    ArrayList<Chord> chordArray = new ArrayList<Chord>();

    public ChordEditor() {
        this.repaint();
    }

    @Override
    public void paint(Graphics g) {
        System.out.println("entering paint function");
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        Toolkit.getDefaultToolkit().sync();
        System.out.println("drawing line");
        g2d.drawLine(10, 10, 40, 40);
        g.dispose();
    }
}

Где я добавляю его в JFrame:

ChordEditor ce = new ChordEditor();
m_frame.getContentPane().removeAll();
m_frame.add(ce);
m_frame.getContentPane().repaint();
1 2

1 ответ:

Тот факт, что вы выдаете repaint сразу после добавления компонент предлагает сделать это на уже видимом кадре. Возможно, вам следует validate сначала рамка. для меня работает следующее:

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

class ChordEditor extends JPanel {

    public ChordEditor() {
        this.repaint();
    }

    @Override
    public void paint(Graphics g) {
        System.out.println("entering paint function");
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        Toolkit.getDefaultToolkit().sync();
        System.out.println("drawing line");
        g2d.drawLine(10, 10, 40, 40);
        //g.dispose();
    }

    public static void main(String[] args) {
        JFrame m_frame = new JFrame();
        m_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        m_frame.setSize(600, 400);
        m_frame.setVisible(true);
        ChordEditor ce = new ChordEditor();
        m_frame.getContentPane().removeAll();
        m_frame.add(ce);
        m_frame.getContentPane().repaint();
        m_frame.validate();
    }
}

Как уже говорилось в комментариях к вашему вопросу, вы должны переопределить paintComponent вместо того, чтобы paint, и тебе не стоит звонить dispose поскольку вы не создавали этот графический контекст.

Призывы к sync и еще repaint должно быть, это тоже не нужно, я думаю, что вы добавили их в попытке решить эту проблему здесь. Так что вы можете удалить их, как только все будет работать на вас. Вы также можете добавить все компоненты в кадр, прежде чем сделать его видимым. Это вызовет неявную проверку и является более распространенным подходом к windows с фиксированной конфигурацией элементов управления, которые они содержат.