gpt4 book ai didi

Java 不会从另一个类中绘制 paintComponent

转载 作者:行者123 更新时间:2023-11-29 08:32:11 24 4
gpt4 key购买 nike

我有一个主类和一个子类 Circle,其中有一个 paintComponent 方法。我正在尝试将该方法调用到我的主类以绘制圆,但什么也不会出现,我不确定为什么?

我的圈子类:

public class Circle extends Shape {
Integer rad;

public Circle(int posx,int posy, int rad) {
this.posx = posx;
this.posy = posy;
this.rad = rad;
}

class drawCircle extends JPanel {
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.green);
g.fillOval(posx,posy,rad,rad);
}
}
}

我的主要方法片段

public class drawFrame extends JFrame {
JPanel panel1;
JPanel panel2;
Square square1;
Circle circle1;



public drawFrame() {

panel2= new JPanel();
panel1= new JPanel();

int rad = 0;
circle1 = new Circle(posx, posy,rad);
Circle.drawCircle drawCi = circle1.new drawCircle();
add(panel1, BorderLayout.CENTER);
panel1.add(drawCi);

基本上我只是给出了代码主要部分的一些片段。我尝试做的是从 Circle drawCircle 内部类创建一个新对象,将其添加到 mainPanel,以便我的 Jframe 输出我的 mainPanel内容应该是我创建的新 Circle 对象?但这似乎不起作用。

最佳答案

你的代码很困惑,我建议简化。

问题:

  • 您正在不必要地使用内部类 drawCircle。不要在不需要时嵌套类,而是为绘图组件提供其自己的独立类。
  • 您正在创建绘图组件,但从未将其添加到 GUI。如果不将它添加到顶层窗口,这里是 JFrame,它将永远不会显示。 编辑:您实际上是在添加它,但它的首选大小是 0,0
  • 您正在覆盖 paint 而不是 paintComponent。这会带来问题(稍后尝试执行此操作时动画不稳定)和风险(绘制也会影响组件的子组件和边框绘制)。
  • 您的绘图组件没有设置首选尺寸,因此它将尺寸设置为 [0,0],这不利于显示其绘图。

相反(再次)创建一个独立的、非嵌套的类来扩展 JPanel,在您绘制圆的地方覆盖它的 paintComponent 并确保将它添加到显示的 JFrame 中。还可以设置绘图组件的首选大小或覆盖其 getPreferredSize() 方法。当然一定要在添加组件后pack() JFrame,然后在打包后调用setVisible(true)

一个小问题:你会想要学习和使用Java naming conventions .变量名应全部以小写字母开头,而类名应以大写字母开头。了解并遵循这一点将使我们能够更好地理解您的代码,并使您能够更好地理解其他人的代码。

小问题 2:你的辐射场(大概以半径命名)应该被称为“直径”,因为它被用作直径,而不是半径。

例如,

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.*;

@SuppressWarnings("serial")
public class DrawCircle extends JPanel {
private static final int PANEL_WIDTH = 600;
private static final Color CIRCLE_COLOR = Color.GREEN;
private int posx;
private int posy;
private int diameter;

public DrawCircle(int posx, int posy, int diamter) {
setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_WIDTH));
this.posx = posx;
this.posy = posy;
this.diameter = diamter;
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// for smooth graphics
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(CIRCLE_COLOR);
g2.fillOval(posx, posy, diameter, diameter);
}

private static void createAndShowGui() {
DrawCircle mainPanel = new DrawCircle(100, 100, 400);

JFrame frame = new JFrame("DrawCircle");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}

关于Java 不会从另一个类中绘制 paintComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47001786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com