JAVA无法从另一个类中绘制到JFrame上

我知道这是我的错误。 我的问题是为什么这不起作用我错过了什么我可以称之为我把它作为一个方法而不是一个类所以我假设他们的第三类有问题?

第1类:

package assignment.pkg1.java; import java.awt.Color; import javax.swing.JFrame; public class JVMVeiwer { /** * @param args the command line arguments */ public static void main(String[] args) { final int FRAME_WIDTH = 1000; // Frame Width final int FRAME_HEIGHT = 800; // Frame Height JFrame frame = new JFrame(); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); //Sets Frame Size frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("JVM Diagram");// Sets the Title JVMComponent component = new JVMComponent(); frame.setBackground(Color.WHITE); frame.add(component); // adds the diagram to the JFrame frame.setVisible(true); // Makes the frame visible } 

}

第2类:

 package assignment.pkg1.java; import java.awt.*; import javax.swing.JComponent; public class JVMComponent extends JComponent { @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; // recover the graphic JVMDiagram diagram = new JVMDiagram(); // creates an instance of JVM Diagram diagram.draw(g2); } } 

第3类这是一个不能用于绘制到jframe的:

 package assignment.pkg1.java; import java.awt.Color; import java.awt.Graphics2D; import javax.swing.JComponent; public class JVMDiagram { // Constructor public JVMDiagram() { } // Draw method for shape public void draw(Graphics2D g2) { // Detailed instructions to draw shape int x = getWidth(); int y = getHeight(); int temp, temp2; int width = x / 2; int height = x / 2; x = (x - width) / 2; y= (y - height) / 2; g2.setColor(Color.RED); g2.drawOval(x, y, width, height); g2.drawRect(x, y, width, height); g2.setColor(Color.RED); g2.drawLine(x, y, width + x, height + y); g2.drawRoundRect(x, y, width, height, y, y); g2.drawLine(x + width, y, x, height + y); } 

}

你的问题是你滥用inheritance。 您的JVMDiagram正在扩展JVMComponent,它不应该。 是的,您获得了JVMComponent的getWidth()和getHeight()方法,但它们并不意味着什么,因为JVMDiagram没有作为组件添加到GUI,不应该作为组件添加,并且它具有0高度和宽度(打印出来)。

重新考虑你的设计, 不要为此使用inheritance。 而是在需要时将值从一个对象传递到另一个对象。 例如,在JVMComponent中创建一个JVMDiagram字段并对其进行初始化。 在JVMComponent的paintComponent方法中,使用JVMDiagram绘制方法中的Graphics2D传递宽度和高度。

边问题:永远不要在绘画方法中或从绘画方法中调用的代码中调用repaint()