Java JPanel paint()有时不绘制图像
我想画一幅月球的图像。 为此,我首先画了一幅Java JPanel paint()有时不绘制图像,java,swing,Java,Swing,我想画一幅月球的图像。 为此,我首先画了一幅JPanel黑色,然后画了一幅图像来描绘月球。 在这之前一切都很好 接下来,在顶部绘制第二幅图像(一个遮罩),模拟地球的阴影以获得不同的相位。 但是,有时会画面具,但有时不画,导致满月显示错误。这完全是随机发生的!当左键点击,我得到的是mask-01.png,mask-06.png,mask-12.png,mask-17.png 在每个右键单击后显示单个帧的GIF: 我做错了什么 守则: import java.awt.Color; import j
JPanel
黑色,然后画了一幅图像
来描绘月球。
在这之前一切都很好
接下来,在顶部绘制第二幅图像
(一个遮罩),模拟地球的阴影以获得不同的相位。
但是,有时会画面具,但有时不画,导致满月显示错误。这完全是随机发生的!当左键点击,我得到的是mask-01.png
,mask-06.png
,mask-12.png
,mask-17.png
在每个右键单击后显示单个帧的GIF:
我做错了什么
守则:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class App {
int moonAgeDays = 0;
float LUNAR_CYCLE_DAYS = 29.5306f;
JFrame frame;
MoonImage moonImage;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
App window = new App();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
App() {
frame = new JFrame("Moon Draw");
frame.setLocationByPlatform(true);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
moonImage = new MoonImage();
moonImage.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent mouseEvent) {
moonAgeDays += mouseEvent.getButton() == MouseEvent.BUTTON1 ? 1 : -1;
if (moonAgeDays < 0)
moonAgeDays = (int) LUNAR_CYCLE_DAYS;
else if (moonAgeDays > LUNAR_CYCLE_DAYS)
moonAgeDays = 0;
updateMask();
}
});
frame.getContentPane().add(moonImage);
updateMask();
frame.pack();
}
void updateMask() {
int phase = (int) Math.toDegrees(Math.acos(-Math.cos(moonAgeDays
/ LUNAR_CYCLE_DAYS * 2 * Math.PI)));
moonImage.update(phase, moonAgeDays > LUNAR_CYCLE_DAYS / 2 ? 180 : 0);
}
}
class MoonImage extends JPanel {
private int phaseAngle = 0;
private int rotateBy = 0;
private static final long serialVersionUID = 1L;
private final int MOON_PADDING = 10;
private final int MOON_SIZE = 130;
private final Image IMAGE_MOON = Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/moon.png"));
private final Image IMAGE_MASK[] = {Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-01.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-02.png")) ,
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-03.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-04.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-05.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-06.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-07.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-08.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-09.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-10.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-11.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-12.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-13.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-14.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-15.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-16.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-17.png")),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource("/resources/mask-18.png"))};
MoonImage() {
this.setPreferredSize(new Dimension(MOON_SIZE + MOON_PADDING * 2, MOON_SIZE + MOON_PADDING * 2));
}
/** Update MoonImage with a Mask and Angle to rotate Mask by*/
public void update(int phaseAngle, int rotateBy) {
this.phaseAngle = phaseAngle;
this.rotateBy = rotateBy;
repaint();
}
@Override
public void paintComponent(Graphics graphic) {
super.paintComponent(graphic);
boolean resultMaskDraw = false;
Graphics2D graphics2d = (Graphics2D) graphic;
graphics2d.setColor(Color.BLACK);
graphics2d.fillRect(0, 0, MOON_SIZE + MOON_PADDING * 2, MOON_SIZE + MOON_PADDING * 2);
graphics2d.drawImage(IMAGE_MOON, MOON_PADDING, MOON_PADDING, this);
int phaseBy10 = Math.round(phaseAngle / 10);
if (phaseBy10 != 0) {
if (rotateBy != 0) {
AffineTransform at = new AffineTransform();
at.translate(MOON_SIZE / 2 + MOON_PADDING, MOON_SIZE / 2 + MOON_PADDING);
at.rotate(Math.toRadians(rotateBy));
at.translate(-MOON_SIZE / 2, -MOON_SIZE / 2);
resultMaskDraw = graphics2d.drawImage(IMAGE_MASK[phaseBy10 - 1], at, this);
} else
resultMaskDraw = graphics2d.drawImage(IMAGE_MASK[phaseBy10 - 1], MOON_PADDING, MOON_PADDING, this);
}
String maskInfo = phaseBy10 == 0 ? "No mask" : String.format("mask-%02d.png", phaseBy10);
graphics2d.setColor(phaseBy10 == 0 || resultMaskDraw ? Color.BLUE : Color.RED);
graphics2d.drawString((phaseBy10 == 0 || resultMaskDraw ? "Drew: " : "Failed: ")
+ maskInfo, 5, MOON_SIZE + MOON_PADDING * 2 - 5);
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.Toolkit;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.geom.AffineTransform;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类应用程序{
int moonAgeDays=0;
浮动月球周期天数=29.5306f;
JFrame框架;
卫星影像;
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
应用程序窗口=新应用程序();
window.frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
App(){
框架=新的JFrame(“月亮画”);
frame.setLocationByPlatform(真);
frame.setresizeable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
moonImage=新的moonImage();
moonImage.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标点击(MouseEvent MouseEvent){
mouseEvent.getButton()==mouseEvent.BUTTON1?1:-1;
如果(月日<0)
月球日=(int)月球周期日;
else if(月日>月日)
月龄天数=0;
updateMask();
}
});
frame.getContentPane().add(moonImage);
updateMask();
frame.pack();
}
void updateMask(){
int phase=(int)Math.toDegrees(Math.acos(-Math.cos(moonAgeDays
/月球周期(天*2*Math.PI));
更新(阶段,月日>月周日/2?180:0);
}
}
类MoonImage扩展了JPanel{
专用int相位角度=0;
私有int rotateBy=0;
私有静态最终长serialVersionUID=1L;
私人最终整数月亮_填充=10;
私人最终内部尺寸=130;
私有最终图像Image_MOON=Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/MOON.png”);
私有最终图像\u掩码[]={Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/MASK-01.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-02.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-03.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-04.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-05.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-06.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-07.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-08.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-09.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-10.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-11.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-12.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-13.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-14.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-15.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-16.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-17.png”),
Toolkit.getDefaultToolkit().createImage(MoonImage.class.getResource(“/resources/mask-18.png”))};
卫星图像(){
此.setPreferredSize(新维度(月亮大小+月亮填充*2,月亮大小+月亮填充*2));
}
/**使用遮罩和旋转遮罩的角度更新MoonImage*/
公共无效更新(int phaseAngle,int rotateBy){
this.phaseAngle=phaseAngle;
this.rotateBy=rotateBy;
重新油漆();
}
@凌驾
公共组件(图形){
超级组件(图形);
布尔值resultMaskDraw=false;
Graphics2D Graphics2D=(Graphics2D)graphics;
图形2D.setColor(颜色为黑色);
graphics2d.fillRect(0,0,月亮大小+月亮填充*2,月亮大小+月亮填充*2);
graphics2d.drawImage(图像加上月亮,月亮加上填充,月亮加上填充,这个);
int phaseBy10=数学四舍五入(phaseAngle/10);
如果(相10!=0){
如果(旋转比!=0){
AffineTransform at=新的AffineTransform();
at.翻译(MOON_SIZ)
resultMaskDraw = graphics2d.drawImage(IMAGE_MASK[phaseBy10 - 1], at, this);
resultMaskDraw = graphics2d.drawImage(IMAGE_MASK[phaseBy10 - 1], at, null);