我在重写JPanel子类ChordEditor中的paint()方法时遇到问题。即使当我重写paint()方法,将其添加到框架中,并调用paint(。打印输出的"输入绘画功能"不打印。有人能帮我吗?
我的和弦编辑器类:
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();
添加组件后立即发出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
,因为您没有创建此Graphics上下文。
对sync
和repaint
的调用也应该是不必要的,我想您添加它们是为了解决这个问题。因此,一旦事情对你有利,你可能会删除它们。您也可以考虑在使框架可见之前将所有组件添加到框架中。这样做将导致隐式验证,并且是对具有固定控件配置的窗口更常见的方法。