我有一个JFrame,我正在使用它覆盖paint
方法来显示一些图形。我还想为它添加一个JPanel,它将显示在图形之上。现在,我看到的是从JFrame绘制方法创建的图形。
这是我的JPanel:
public class NoteDraw extends JPanel {
public NoteDraw() {
setSize(200, 100);
setBackground(Color.BLACK);
}
@Override public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(0, 0, 100, 100);
}
}
这是我的JFrame:
public class ui extends JFrame {
public void paint(Graphics g) {
//do some drawing here...
}
}
这是我的主要内容:
public class Main {
static ui main_gui = new ui();
public static void main(String[] args) {
NoteDraw note = new NoteDraw();
main_gui.getContentPane().add(note);
main_gui.setVisible(true);
}
}
答案 0 :(得分:1)
你永远不应该覆盖JFrame的paint()方法(除非你真的知道你在做什么)。此方法负责Swing的所有优化绘制行为。
自定义绘画应始终通过重写Swing组件的paintComponent()方法来完成,就像在NoteDraw面板上完成一样。
paint方法中的代码未显示的原因是因为NoteDraw面板是不透明的,因此面板绘制了paint方法中图形代码的顶部。
因此解决方案是将Graphics绘图代码移动到NoteDraw面板。
或者,如果您尝试为框架创建某种背景图像,则可以尝试使用Background Panel。
或者如果你确实需要自定义绘画,那么你创建一个背景面板并覆盖paintComponent()方法。然后将布局设置为BorderLayout并将此面板添加到框架中。然后,将NoteDraw面板设置为非透明,并将其添加到自定义背景面板。现在,背景将在NoteDraw面板上显示。
答案 1 :(得分:-1)
请务必在覆盖super.paint()
方法时致电paint()
。
这样,您仍然可以使用父类中定义的行为,并且可以安全地添加修改。
资源: