gpt4 book ai didi

java - Graphics2D 绘制不正确,它只绘制椭圆形的一部分

转载 作者:行者123 更新时间:2023-12-02 09:27:22 25 4
gpt4 key购买 nike

我正在尝试使用 Graphics2D 在 JFrame 上绘制一个椭圆形,我希望它随窗口调整大小,从技术上讲它确实如此,它只是不绘制大约三分之一的椭圆形。这肯定是我做错了,我是 Java 的 Graphics2D 部分的新手。

我不确定这是否是我的计算机的问题,所以我尝试在另一台电脑上运行我的代码以再次发生这种情况,所以我不确定我哪里出了问题。

import javax.swing.*;
import java.awt.*;

public class ClockViewer {
public static void main(String[] args) {
//create frame
JFrame frame = new JFrame();
final int Frame_Width = 110;
final int Frame_Height = 130;

//set frame attributes
frame.setSize(Frame_Width, Frame_Height);
frame.setTitle("A Really Descriptive Title...");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//get pane attributes
System.out.println(frame.getContentPane().getWidth());
System.out.println(frame.getContentPane().getHeight());

//create ellipse
EllipseComponent ellipse = new EllipseComponent();

//add ellipse to frame
while(frame.getContentPane().getHeight() > 0 && frame.getContentPane().getWidth() > 0) {
int posX = Math.round(frame.getContentPane().getWidth() / 100) * 20;
int posY = Math.round(frame.getContentPane().getHeight() / 100) * 20;
int Width = Math.round(frame.getContentPane().getWidth() / 100) * 80;
int Height = Math.round(frame.getContentPane().getHeight() / 100) * 80;
ellipse.setAll(posX, posY, Width, Height);
frame.add(ellipse);
}
}
}

这是下一个文件:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class EllipseComponent extends JComponent {
//global variables for ellipse drawing
int posX = 0;
int posY = 0;
int Width = 0;
int Height = 0;

//getters for getting variables values
public int getPosX() {
return this.posX;
}
public int getPosY() {
return this.posY;
}
@Override
public int getWidth() {
return this.Width;
}
@Override
public int getHeight() {
return this.Height;
}

//setters for setting variable values
public void setPosX(int newPosX) {
this.posX = newPosX;
}
public void setPosY(int newPosY) {
this.posY = newPosY;
}
public void setWidth(int newWidth) {
this.Width = newWidth;
}
public void setHeight(int newHeight) {
this.Height = newHeight;
}

//setter for all variables
public void setAll(int newPosX, int newPosY, int newWidth, int newHeight) {
this.posX = newPosX;
this.posY = newPosY;
this.Width = newWidth;
this.Height = newHeight;
}

//paint ellipse using graphics
@Override
public void paint(Graphics g) {
Graphics g2 = (Graphics2D) g;
g2.drawOval(posX, posY, Width, Height);
}
}

感谢大家为我提供的帮助^^

编辑:如果有帮助的话,我会收到这些错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: No such child: 0

at java.awt.Container.getComponent(Container.java:336)

at javax.swing.JComponent.rectangleIsObscured(JComponent.java:4390)

at javax.swing.JComponent.paint(JComponent.java:1054)

at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210)

at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)

at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)

at javax.swing.RepaintManager.paint(RepaintManager.java:1272)

at javax.swing.JComponent._paintImmediately(JComponent.java:5158)

at javax.swing.JComponent.paintImmediately(JComponent.java:4969)

at javax.swing.RepaintManager$4.run(RepaintManager.java:831)

at javax.swing.RepaintManager$4.run(RepaintManager.java:814)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)

at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)

at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)

at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)

at java.awt.EventQueue.access$500(EventQueue.java:97)

at java.awt.EventQueue$3.run(EventQueue.java:709)

at java.awt.EventQueue$3.run(EventQueue.java:703)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

最佳答案

我没有收到您收到的错误。然而,这不是在 Swing 中进行自定义绘画的正确方法。我建议你看看how to perform custom painting 。长话短说,您在 while 条件下尝试的这件事将不起作用。相反,让组件根据其父级大小和坐标进行绘制,而无需显式设置它们:

/**
* @Overide paint method was a thing in AWT.
* In Swing you must override paintComponent (and call super.paintComponent())
* in order to respect the paint chain.
*
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (getParent() != null) { //Paint according to parent
Graphics g2 = (Graphics2D) g;
//Calculations
int posX = Math.round(getParent().getWidth() / 100) * 20;
int posY = Math.round(getParent().getHeight() / 100) * 20;
int Width = Math.round(getParent().getWidth() / 100) * 80;
int Height = Math.round(getParent().getHeight() / 100) * 80;
g2.drawOval(posX, posY, Width, Height);
}
}

您所做的另一件不必要的事情是:

@Override
public int getWidth() {
return this.Width;
}

重写组件的 getWidthgetSize 不会引导您到任何地方。

我建议您阅读的其他有用链接是 the Initial ThreadsWhy shouldn't I call setVisible(true) before adding components?

完整示例:

public class ClockViewer {
public static void main(String[] args) {
SwingUtilities.invokeLater(()->{
// create frame
JFrame frame = new JFrame();
final int Frame_Width = 110;
final int Frame_Height = 130;

// set frame attributes
frame.setSize(Frame_Width, Frame_Height);
frame.setTitle("A Really Descriptive Title...");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// get pane attributes
System.out.println(frame.getContentPane().getWidth());
System.out.println(frame.getContentPane().getHeight());

// create ellipse
JComponent ellipse = new JComponent() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (getParent() != null) { //Paint according to parent
Graphics g2 = (Graphics2D) g;
//Calculations
int posX = Math.round(getParent().getWidth() / 100) * 20;
int posY = Math.round(getParent().getHeight() / 100) * 20;
int Width = Math.round(getParent().getWidth() / 100) * 80;
int Height = Math.round(getParent().getHeight() / 100) * 80;
g2.drawOval(posX, posY, Width, Height);
}
}
};
frame.add(ellipse);
frame.setVisible(true);
});

}
}

关于java - Graphics2D 绘制不正确,它只绘制椭圆形的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250213/

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