Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPanel paint()有时不绘制图像_Java_Swing - Fatal编程技术网

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);