#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() выдавали мне нулевые значения, поэтому ничего не появлялось, потому что это то, что я использовал в качестве координат.