2

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

1 に答える 1

2

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代わりにオーバーライドする必要があり、この Graphics コンテキストを作成していないため、paint呼び出すべきではありません。dispose

と の呼び出しも不要である必要がsyncありrepaintます。ここでこの問題を解決するために追加したと思います。したがって、問題が解決したら、それらを削除することができます。フレームを表示する前に、すべてのコンポーネントをフレームに追加することも検討してください。これを行うと、暗黙的な検証が行われ、ウィンドウに含まれるコントロールの構成が固定されているウィンドウに対するより一般的なアプローチです。

于 2012-08-06T13:39:31.283 に答える