有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从未调用JPanel子类中的java重写paint()函数?

在我的JPanel子类ChordEditor中重写paint()方法时遇到问题。即使我重写paint()方法,将其添加到框架中,并调用repaint(),也不会调用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) 个答案

  1. # 1 楼答案

    在添加组件后立即发出^{}的事实表明,在已经可见的帧上这样做也许你应该先^{}以下内容适合我:

    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();
        }
    }
    

    正如在对您的问题的评论中所述,您应该覆盖^{}而不是^{},并且您不应该调用^{},因为您没有创建此图形上下文

    ^{}^{}的调用也应该是不必要的,我猜您添加它们是为了解决这个问题。因此,一旦事情对你有利,你可能会移除它们。您还可以考虑将所有组件添加到框架中才能使其可见。这样做会导致隐式验证,这是对包含固定控件配置的windows更常见的方法