JAVA не может рисовать в JFrame из другого класса

#java #swing #awt

#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:

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

}

Комментарии:

1. Примечание: paintComponent вызывается каждый раз, когда возникает необходимость перерисовки. Вы действительно уверены, что хотите создать JVMDiagram там сотни объектов?

Ответ №1:

Ваша проблема в том, что вы неправильно используете наследование. Ваша JVMDiagram расширяет JVMComponent, а этого не должно быть. Да, вы получаете методы getWidth() и getHeight() JVMComponent, но они ничего не значат, поскольку JVMDiagram не добавляется в графический интерфейс как компонент, не должен добавляться как компонент, и он имеет 0 height и width (распечатайте их).

Переосмыслите свой дизайн, не используйте для этого наследование. Вместо этого передавайте значения из одного объекта в другой, если это необходимо. Например, создайте поле JVMDiagram в JVMComponent и инициализируйте его. Передайте ширину и высоту с помощью Graphics2D в методе рисования JVMDiagram в методе paintComponent JVMComponent.

Побочная проблема: никогда не вызывайте repaint() из метода рисования или из кода, который вызывается из метода рисования.

Комментарии:

1. Спасибо, я просто некоторое время экспериментировал, чтобы попытаться заставить его работать, отсюда перерисовка и расширение JVMComponent, но проблема все еще остается.

2. Извините, проблема заключалась в том, что в методах рисования getWidth() и getHeight() выдавали мне нулевые значения, поэтому ничего не появлялось, потому что это то, что я использовал в качестве координат.