gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:34:18 24 4
gpt4 key购买 nike

我在重写 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();

最佳答案

您发出 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因为您没有创建此图形上下文。

调用syncrepaint也应该是不必要的,我猜你添加它们是为了在这里解决这个问题。因此,一旦对您有用,您就可以删除它们。您还可以考虑在框架可见之前将所有组件添加到框架中。这样做会导致隐式验证,并且是对包含固定控件配置的窗口更常见的方法。

关于java - JPanel 子类中重写的 paint() 函数从未调用过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11828660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com