Java 画布/JPanel是否未显示在JFrame上?

Java 画布/JPanel是否未显示在JFrame上?,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我有一个MyFrame类,它扩展了JFrame。我使用NetBeans中的设计选项将组件(控件即按钮)添加到此框架。我有一个MyCanvas类,它用一个重写的paintComponent()方法扩展了JPanel。我正在尝试将此组件添加到MyFrame类中。但是当我添加它并使其可见时,画布(JPanel)不会显示在JFrame上。 (首先,我试图添加由Canvas扩展的Mycanvas类。但是,我在这里读了一个线程,试图将其更改为JPanel。我也没有工作。对于Canvas,我显然使用的不是pa

我有一个
MyFrame
类,它扩展了
JFrame
。我使用NetBeans中的设计选项将组件(控件即按钮)添加到此框架。我有一个
MyCanvas
类,它用一个重写的
paintComponent()
方法扩展了
JPanel
。我正在尝试将此组件添加到
MyFrame
类中。但是当我添加它并使其可见时,画布(
JPanel
)不会显示在
JFrame
上。 (首先,我试图添加由
Canvas
扩展的
Mycanvas
类。但是,我在这里读了一个线程,试图将其更改为
JPanel
。我也没有工作。对于Canvas,我显然使用的不是
paintcomponent()
) 我的代码在下面

MyCanvas类

 public class MyCanvas extends javax.swing.JPanel{

 MyCanvas()
 {
      super();
 }

 @Override
 public void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D graphics2D=(Graphics2D)g;

    graphics2D.drawRect(10, 10, 10, 10);

    graphics2D.drawOval(0, 0, 100, 100);
}

}
MyFrame

public class Myframe extends javax.swing.JFrame {

public Myframe() {

    initComponents();
  @SuppressWarnings("unchecked")
  +generatedcode by the designer

 private void RectangleActionPerformed(java.awt.event.ActionEvent evt) {
}

private void SquareActionPerformed(java.awt.event.ActionEvent evt) {
}

private void CircleActionPerformed(java.awt.event.ActionEvent evt) {
}

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
 java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Myframe().setVisible(true);
        }
    });
}
public void run() {
        new Myframe().setVisible(true);
    }
// Variables declaration - do not modify
private javax.swing.JButton Circle;
private javax.swing.JButton Rectangle;
private javax.swing.JButton Square;
// End of variables declaration
}
我的主程序

public static void main(String[] args) {

    MyCanvas c = new MyCanvas();
    Myframe f= new Myframe();//Works if used JFrame instead of MyFrame

    f.add(c);
    f.setVisible(true);
}
基本上,我想创建一个GUI,在其中我需要可以触发事件和更改画布上绘制内容的按钮。我用空的jframe试了一下。将画布/面板添加到JFrame。成功了。此外,我还更改了面板/画布,并重新设置了框架。这也很有效。但我不能这样做。

尝试将其更改为:

public static void main(String[] args) {

    MyCanvas c = new MyCanvas();
    Myframe f= new Myframe();//Works if used JFrame instead of MyFrame

    f.add(c);
    c.setVisible(true);
    f.setVisible(true);
}
另外,您的
MyFrame
类中的代码:

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
 java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Myframe().setVisible(true);
        }
    });
}
除非运行的是
MyFrame
,而不是主程序,否则不会执行


还要检查您的
MyFrame
构造函数中是否有
super()
调用。

问题是您正在将创建
JFrame
与IDE混合,并自己创建
JPanel
,请记住IDE将所有组件添加到
initComponents()中的
JFrame
这是理想的添加
画布的地方

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.setColor(Color.BLACK);

    Graphics2D graphics2D=(Graphics2D)g;

    graphics2D.drawRect(10, 10, 10, 10);

    graphics2D.drawOval(0, 0, 100, 100);
}
自己创建
JFrame
JPanel
(不使用Netbeans GUI Builder)

您可以使用Netbeans的调色板管理器将
组件
添加到调色板中,然后可以在GUI生成器中使用它,就像在任何其他类中一样:

(只需将
Canvas
类从项目树拖动到GUI设计器中的
JFrame

要确保您的自定义
Canvas
功能:

  • 重写
    getPreferedSize(..)
    并返回适合的大小
参考资料:


No.t不起作用。我也试过很多次
f.invalidate()
f.validate()`f.repaint()`我将如何运行MyFrame的主代码(如您所说)?在MyFrame中添加了super(),但它仍然不起作用。好吧,现在我已经按照您的说明进行了编辑,我的画布显示出来了。但是由于initcomponents方法已被删除,因此它不会显示我添加的按钮。我希望按钮和画布能够显示出来。这是预期的结果吗?根据我的要求有什么方法可以做到吗?我的按钮应该是我在设计器中放置的按钮。画布至少应该随按钮一起显示(我没有考虑画布的位置)。我应该在哪里调用initComponents方法?我应该得到一些积极的结果,画布和按钮都显示出来。如果你能指导我如何设置画布位置。这就是我正在尝试做的。我会深入研究,并尝试落实。谢谢@David Kroukamp