不是用Java绘制的形状
谁能帮我一下,告诉我为什么矩形不会出现?框架运行良好,但未显示任何形状。我尝试了几种不同的方法,包括使用两个单独的类,但是我得到的只是一个空框架不是用Java绘制的形状,java,swing,jframe,Java,Swing,Jframe,谁能帮我一下,告诉我为什么矩形不会出现?框架运行良好,但未显示任何形状。我尝试了几种不同的方法,包括使用两个单独的类,但是我得到的只是一个空框架 import java.awt.Color; import java.awt.Graphics2D; import javax.swing.JFrame; import javax.swing.JPanel; public class Surface extends JPanel { public void paintComponent(
import java.awt.Color;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Surface extends JPanel
{
public void paintComponent(Graphics2D g)
{
super.paintComponent(g);
g.setColor(Color.RED);
g.drawRect(100, 100, 30, 40);
}
public static void main(String[] args)
{
Surface s = new Surface();
JFrame jf = new JFrame();
jf.setTitle("Tutorial");
jf.setSize(600, 400);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(s);
s.repaint();
}
}
如果要重写某个方法,请正确地对其进行注释:
@Override
public void paintComponent(Graphics2D g)
{
super.paintComponent(g);
g.setColor(Color.RED);
g.drawRect(100, 100, 30, 40);
}
然后IDE应该告诉您,您没有正确重写paintComponent
方法,因为您的参数类型Graphics2D
是错误的
这是inJComponent
中组件的签名:
如您所见,它使用图形
而不是图形2d
。您当前使用的是paintcomponent
,而不是它。因此,将参数类型更改为Graphics
(并导入java.awt.Graphics
)即可:
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.RED);
g.drawRect(100, 100, 30, 40);
}
顺便说一句,您首先要设置jf
的可见性,然后向其内容窗格添加内容。在某些情况下,这可能会导致问题,并且添加的组件在重新绘制帧(或执行其他操作,导致帧重新绘制自身,如调用pack()
)之前将不可见。因此,最好在main
方法中切换这些方法调用的顺序:
Surface s = new Surface();
JFrame jf = new JFrame();
jf.setTitle("Tutorial");
jf.setSize(600, 400);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(s);
//s.repaint(); // not needed anymore, because "jf" will repaint everything during the 'setVisible' call
jf.setVisible(true); // should almost always be the last thing you do
谢谢你的帮助,谢谢。但是,我对我的代码做了这些更改,但仍然不起作用。@Santi请确保您使用
java.awt.Graphics
作为参数类型,而不是任何其他Graphics
版本。这就是现在的样子:@Santi如果我运行该代码,那么我可以看到红色矩形:这很奇怪,我的eclipse可能有问题?
Surface s = new Surface();
JFrame jf = new JFrame();
jf.setTitle("Tutorial");
jf.setSize(600, 400);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(s);
//s.repaint(); // not needed anymore, because "jf" will repaint everything during the 'setVisible' call
jf.setVisible(true); // should almost always be the last thing you do