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