java - 我正在尝试使用图形并绘制一些矩形
问题描述
您好,我正在尝试在 java 中学习图形,同时学习类和对象。我现在的目标是制作一个包含不同类的程序,其中包含 Rectangles 或 Circles,然后我想在其他类中使用这些 Rectangles 和 Circles,并更改它们的大小、颜色和位置等参数来绘制某种图案。
我现在的问题是我可以制作一个矩形,我想我什至可以制作第二个,但我无法更改它的参数(颜色、大小和位置)我尝试将变量添加到这部分代码 Rect rect = new Rect(int variables);
但它没有不行。
通常我可以解决这样的简单问题,但如果有人能给我一些帮助,我真的不明白类和对象在 java 中是如何工作的。
这是我的代码
public class Main{
public static void main(String[] args ) {
Pattern.drawPattern();
}
}
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class Rect extends JPanel{
public static Color myColor = Color.RED;
public static int myX = 10;
public static int myY = 10;
public static int myWidth = 200;
public static int myHeight = 200;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(myColor);
g.fillRect(myX, myY, myWidth, myHeight);
}
}
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
public class Pattern {
public static void drawPattern() {
JFrame window = new JFrame("test");
window.setSize(1000, 800);
window.setVisible(true);
window.setResizable(false);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Rect rect = new Rect();
Rect rect1 = new Rect();
window.add(rect);
window.add(rect1);
Rect.myColor = Color.lightGray;
}
}
解决方案
这里有很多问题,但我能看到的主要问题是:
- 在 Rect 类中过度使用静态修饰符。通过使用静态字段, Rect 实例将不会有自己独特的状态、自己的颜色和位置。将所有这些字段设为私有非静态(实例)。如果这会导致编译问题,请不要将字段设为静态,而是不要尝试从类中访问它们来修复它。
- 如果您要在类之外更改它们,也请提供这些字段设置器方法。和 getter 方法,如果你想查询它们
- 您忽略了 JFrame 的 contentPane 默认使用 BorderLayout 的事实。此布局将覆盖先前添加的组件,然后添加任何内容。如果您需要此容器中的多个组件,请使用不同的布局
- 但是您的主要问题是 Rect 不应该扩展 JPanel,它不应该是组件类,而应该是逻辑类。
- 而是创建一个扩展 JPanel 并完成所有绘图的类,然后为其提供多个 Rect 实例以在其单个 paintComponent 方法中进行绘制。
ArrayList<Rect>
您可以为此使用 an 。 - 将此单个绘图 JPanel 添加到 JFrame。如果这样做,则无需更改 JFrame 的布局管理器,因为 BorderLayout 可以很好地工作,允许绘图 JPanel 填充 JFreme 的中心。
小问题:
- 避免给你的类命名与常见的 Java 核心类冲突,例如 Java 正则表达式分析中经常使用的 Pattern
- 不知道为什么你甚至需要 Pattern 类,因为它没有做任何在 main 方法中无法完成的有用的事情。
例如, Rect (或这里命名为 Rect2 以显示它与您的类不同)可能看起来像:
// imports here
public class Rect2 {
private Color myColor = Color.RED;
private int x = 10;
private int y = x;
private int width = 200;
private int height = width;
public Rect2() {
// default constructor
}
public Rect2(Color myColor, int x, int y, int width, int height) {
this.myColor = myColor;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
// method used to allow the rectangle to be drawn
public void draw(Graphics g) {
g.setColor(myColor);
g.fillRect(x, y, width, height);
}
public void setMyColor(Color myColor) {
this.myColor = myColor;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
// more setters and some getters if need be
}
和绘图JPanel类似:
// imports here
public class DrawingPanel extends JPanel {
private static final long serialVersionUID = 1L;
private List<Rect2> rectList = new ArrayList<>();
// ..... more code
public void addRect2(Rect2 rect) {
rectList.add(rect);
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// iterate through the rectList and draw all the Rectangles
for (Rect2 rect : rectList) {
rect.draw(g);
}
}
// ...... more code
}
它可以像这样放入JFrame中......
Rect2 rectA = new Rect2();
Rect2 rectB = new Rect2();
rectB.setMyColor(Color.BLUE);
rectB.setX(300);
rectB.setY(300);
// assuming that the class's constructor allows sizing parameters
DrawingPanel drawingPanel = new DrawingPanel(1000, 800);
drawingPanel.addRect2(rectA);
drawingPanel.addRect2(rectB);
JFrame frame = new JFrame("Main2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(drawingPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
推荐阅读
- python - 如何平均填充字典的 DataFrame?
- reactjs - 通过 google 身份验证从 Auth0 AccessToken 获取用户电子邮件
- vue.js - Vuetify 如何在所有验证规则都为真之前禁用按钮?
- angular - Angular 8 - 如何覆盖 BrowserModule 以进行多应用延迟加载?
- css - 在引导可见打印 div 中打印 iframe Google 地图时出现问题
- angular - 以编程方式删除从 Angular 组件样式导入的 css:窗口顶部框架中的 [] 数组
- linux - 将触发器添加到 Jenkins 管道
- python - 类方法中的变量是否也可以从外部访问?
- reactjs - 带有 setTimeout 的递归函数使开玩笑测试超过最大调用堆栈大小
- javascript - 从右到左和从下到上滚动的插件