Java中的paintComponent()没有被调用

我试图绘制一个简单的矩形,但我认为paintComponent方法没有被调用。 以下是使用main方法的类的代码:

package painting; import java.awt.*; import javax.swing.*; public class Painting { public static void main(String[] args) { JFrame jf; jf = new JFrame("JUST DRAW A RECTANGLE"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setLayout(null); jf.setLocationRelativeTo(null); jf.setSize(600,600); jf.setVisible(true); Mainting maint = new Mainting(); jf.add(maint); } } 

和paintComponent()的类

 package painting; import java.awt.*; import javax.swing.*; public class Mainting extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawRect(0, 0 , 200, 200); System.out.println("haha"); g.setColor(Color.red); } } 

这里有什么问题,我想不出来……

虽然已经提供的答案可能导致矩形出现,但这种方法并不是最佳的。 此示例旨在显示更好的方法。 阅读代码中的注释以获取详细信息。

请注意,应该在EDT上启动Swing / AWT GUI。 这留给读者练习。

 import java.awt.*; import javax.swing.*; public class Painting { public static void main(String[] args) { JFrame jf = new JFrame("JUST DRAW A RECTANGLE"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // null layouts cause more problems than they solve. DO NOT USE! //jf.setLayout(null); jf.setLocationRelativeTo(null); /* if components return a sensible preferred size, it's better to add them, then pack */ //jf.setSize(600, 600); //jf.setVisible(true); // as mentioned, this should be last Mainting maint = new Mainting(); jf.add(maint); jf.pack(); // makes the GUI the size it NEEDS to be jf.setVisible(true); } } class Mainting extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.RED); g.drawRect(10, 10, 200, 200); System.out.println("paintComponent called"); /* This does nothing useful, since nothing is painted before the Graphics instance goes out of scope! */ //g.setColor(Color.red); } @Override public Dimension getPreferredSize() { // Provide hints to the layout manager! return new Dimension(220, 220); } } 

尝试将布局管理器设置为例如。 BorderLayout

所以用

 jf.setLayout(new BorderLayout()); 

然后添加一些约束的组件

 Mainting maint = new Mainting(); jf.add(maint,BorderLayout.CENTER);