Переопределенная функция 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 ответ:
Тот факт, что вы выдаете
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 с фиксированной конфигурацией элементов управления, которые они содержат.