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

标签 java swing awt

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

第 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 上使用 o Paint 的类:

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);
}

}

最佳答案

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

重新考虑您的设计,不要为此使用继承。相反,如果需要,可以将值从一个对象传递到另一个对象。例如,在 JVMComponent 中创建一个 JVMDiagram 字段并对其进行初始化。在JVMComponent的paintComponent方法中的JVMDiagram绘制方法中用Graphics2D传入宽度和高度。

附带问题:切勿从绘画方法内或从绘画方法内调用的代码中调用 repaint()

关于JAVA 无法从另一个类中绘制到 JFrame 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39883671/

相关文章:

类 Java 回调/事件方法?

java - 以下代码片段不会产生预期结果

java - 提交值后如何清除表单?

java - SwingMetawidget,值未绑定(bind)到 JComboBox

java - JCheckbox - ActionListener 和 ItemListener?

java - 将 AWT 应用程序转换为 SWT/JFace

java - java JFrame 错误

JavaFx Controller 设置对象另一个 Controller

java - 获取选定 JTable 单元格的位置?

java - 为什么 GUI 应用程序使用左上角而不是左下角?