Java Swing中的冲突

Java Swing中的冲突,java,swing,interface,Java,Swing,Interface,最近,我一直在编写一个2D沙盒,其中填充了几个运动中的形状,特别是圆。每个圆的速度和大小可以由窗口顶部和底部的两个J滑块控制 动画类 import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; public class Animation extends JFrame { public final int HEIGHT = 500; publ

最近,我一直在编写一个2D沙盒,其中填充了几个运动中的形状,特别是圆。每个圆的速度和大小可以由窗口顶部和底部的两个J滑块控制

动画类

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;

public class Animation extends JFrame {

    public final int HEIGHT = 500;
    public final int WIDTH = 735;
    public int speed = 10, size = 50;
    JSlider sl1, sl2;
    JPanel panel, panel2;
    JLabel label, label2;
    GraphicsDemo gD;

    public Animation() {
        this.setSize(WIDTH+35,HEIGHT+90);
        this.getContentPane();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new JPanel(); panel2 = new JPanel();
        panel.setLayout(new FlowLayout());
        panel2.setLayout(new FlowLayout());
        label = new JLabel("Current Speed: 10");
        label2 = new JLabel("Current Size: 50");

        Dimension length = label.getPreferredSize();
        label.setBounds(150, 200, length.width, length.height);
        setSlider();
        Animation.event e1 = new Animation.event();
        Animation.event e2 = new Animation.event();
        sl1.addChangeListener(e1);
        sl2.addChangeListener(e2);


        panel.add(sl1); panel2.add(sl2);
        panel.add(label); panel2.add(label2);
        gD = new GraphicsDemo(HEIGHT, WIDTH, speed, size, sl1, sl2);
        this.add(gD);

        this.add(panel, BorderLayout.NORTH);
        this.add(panel2, BorderLayout.SOUTH);
        this.setVisible(true);

    }

    public void setSlider() {
        sl1 = new JSlider(JSlider.HORIZONTAL, 0, 20, speed);
        sl1.setMajorTickSpacing(5);
        sl1.setPaintTicks(true);

        sl2 = new JSlider(JSlider.HORIZONTAL, 20, 100, size);
        sl2.setMajorTickSpacing(5);
        sl2.setPaintTicks(true);
    }

    public class event implements ChangeListener {

        @Override
        public void stateChanged(ChangeEvent e) {
            speed = sl1.getValue();
            label.setText("Current speed: " + speed);

            size = sl2.getValue();
            label2.setText("Current size: " + size);
        }
    }
}
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;

public class GraphicsDemo extends JPanel implements ActionListener {

    public ArrayList<Balls> balls = new ArrayList<>();
    Image spaceImage;
    JSlider sl, sl2;
    Timer timer;
    public int h, w, s, size;
    public GraphicsDemo(int WIDTH, int HEIGHT, int SPEED,
                        int SIZE, JSlider slide, JSlider slide2) {
        h = HEIGHT; w = WIDTH;
        sl = slide; sl2 = slide2;
        s = SPEED; size = SIZE;
        init();
        spaceImage = new ImageIcon("C:\\Users\\admin\\Downloads\\space.jpg").getImage();
        timer = new Timer(100, this);
        timer.start();
    }

    public void init() {
        for (int i = 0; i < 10; i++) {
            int x = (int) ((Math.random()*700)+1);
            int y = (int) ((Math.random()*400)+1);
            if (i % 2 == 0) {
                balls.add(new Balls(size, x, y, 10, -10));
            } else {
                balls.add(new Balls(size, x, y, -10, 10));
            }
        }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.BLACK);

        Graphics2D g2D = (Graphics2D) g;

        g2D.drawImage(spaceImage, 0,0, 735, 490, null);

        GradientPaint paint = new GradientPaint(0,0,Color.RED, 420,0,Color.BLUE);
        g2D.setPaint(paint);
        for (Balls ball : balls) {
            ball.render(g2D);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        for (Balls ball : balls) {
            ball.checkBounds();
            ball.changeVel(sl);
            ball.changeSize(sl2);
            for(Balls b : balls) {
          //      ball.collision(b);
            }
        }
        repaint();
    }

    static class Balls {
        Shape oval;
        private int radius;
        private int cx;
        private int cy;
        private int velX, velY;


        Balls(int r, int x, int y, int velX, int velY) {
            this.radius = r;
            this.cx = x;
            this.cy = y;
            this.velX = velX;
            this.velY = velY;
            oval = new Ellipse2D.Double(cx, cy, radius, radius);
        }

        void checkBounds() {
            cx += velX;
            cy += velY;
            if (cx >= 735-radius || cx <= 0) {
                velX *= -1;
            }
            if (cy  >= 490-radius || cy  <= 0) {
                velY *= -1;
            }
        }

        public void collision(Balls o) {
            Area areaA = new Area(oval);
            areaA.intersect(new Area(o.oval));
            if (!areaA.isEmpty()) {
                velX *= -1;
            }
        }

        void changeVel(JSlider sl) {
            if (velX < 0) {
                velX = -sl.getValue();
            } else {
                velX = sl.getValue();
            }
            if(velY < 0) {
               velY = -sl.getValue();
            } else {
                velY = sl.getValue();
            }
        }

        void changeSize(JSlider sl) {
            radius = sl.getValue();
        }

        void render(Graphics2D g) {
            oval = new Ellipse2D.Double(cx, cy, radius, radius);
            g.fill(oval);
        }
    }
} 
import java.awt.geom.Area;
import java.util.ArrayList;

public class Collisions {

    public boolean collision(ArrayList<GraphicsDemo.Balls> balls, Shape o1) {
        Area areaA = new Area(o1);
        for (GraphicsDemo.Balls ball : balls) {
            areaA.intersect(new Area(ball.oval));
            return !areaA.isEmpty();
        }
        return true;
    }
}
GraphicsDemo类

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;

public class Animation extends JFrame {

    public final int HEIGHT = 500;
    public final int WIDTH = 735;
    public int speed = 10, size = 50;
    JSlider sl1, sl2;
    JPanel panel, panel2;
    JLabel label, label2;
    GraphicsDemo gD;

    public Animation() {
        this.setSize(WIDTH+35,HEIGHT+90);
        this.getContentPane();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new JPanel(); panel2 = new JPanel();
        panel.setLayout(new FlowLayout());
        panel2.setLayout(new FlowLayout());
        label = new JLabel("Current Speed: 10");
        label2 = new JLabel("Current Size: 50");

        Dimension length = label.getPreferredSize();
        label.setBounds(150, 200, length.width, length.height);
        setSlider();
        Animation.event e1 = new Animation.event();
        Animation.event e2 = new Animation.event();
        sl1.addChangeListener(e1);
        sl2.addChangeListener(e2);


        panel.add(sl1); panel2.add(sl2);
        panel.add(label); panel2.add(label2);
        gD = new GraphicsDemo(HEIGHT, WIDTH, speed, size, sl1, sl2);
        this.add(gD);

        this.add(panel, BorderLayout.NORTH);
        this.add(panel2, BorderLayout.SOUTH);
        this.setVisible(true);

    }

    public void setSlider() {
        sl1 = new JSlider(JSlider.HORIZONTAL, 0, 20, speed);
        sl1.setMajorTickSpacing(5);
        sl1.setPaintTicks(true);

        sl2 = new JSlider(JSlider.HORIZONTAL, 20, 100, size);
        sl2.setMajorTickSpacing(5);
        sl2.setPaintTicks(true);
    }

    public class event implements ChangeListener {

        @Override
        public void stateChanged(ChangeEvent e) {
            speed = sl1.getValue();
            label.setText("Current speed: " + speed);

            size = sl2.getValue();
            label2.setText("Current size: " + size);
        }
    }
}
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;

public class GraphicsDemo extends JPanel implements ActionListener {

    public ArrayList<Balls> balls = new ArrayList<>();
    Image spaceImage;
    JSlider sl, sl2;
    Timer timer;
    public int h, w, s, size;
    public GraphicsDemo(int WIDTH, int HEIGHT, int SPEED,
                        int SIZE, JSlider slide, JSlider slide2) {
        h = HEIGHT; w = WIDTH;
        sl = slide; sl2 = slide2;
        s = SPEED; size = SIZE;
        init();
        spaceImage = new ImageIcon("C:\\Users\\admin\\Downloads\\space.jpg").getImage();
        timer = new Timer(100, this);
        timer.start();
    }

    public void init() {
        for (int i = 0; i < 10; i++) {
            int x = (int) ((Math.random()*700)+1);
            int y = (int) ((Math.random()*400)+1);
            if (i % 2 == 0) {
                balls.add(new Balls(size, x, y, 10, -10));
            } else {
                balls.add(new Balls(size, x, y, -10, 10));
            }
        }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.BLACK);

        Graphics2D g2D = (Graphics2D) g;

        g2D.drawImage(spaceImage, 0,0, 735, 490, null);

        GradientPaint paint = new GradientPaint(0,0,Color.RED, 420,0,Color.BLUE);
        g2D.setPaint(paint);
        for (Balls ball : balls) {
            ball.render(g2D);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        for (Balls ball : balls) {
            ball.checkBounds();
            ball.changeVel(sl);
            ball.changeSize(sl2);
            for(Balls b : balls) {
          //      ball.collision(b);
            }
        }
        repaint();
    }

    static class Balls {
        Shape oval;
        private int radius;
        private int cx;
        private int cy;
        private int velX, velY;


        Balls(int r, int x, int y, int velX, int velY) {
            this.radius = r;
            this.cx = x;
            this.cy = y;
            this.velX = velX;
            this.velY = velY;
            oval = new Ellipse2D.Double(cx, cy, radius, radius);
        }

        void checkBounds() {
            cx += velX;
            cy += velY;
            if (cx >= 735-radius || cx <= 0) {
                velX *= -1;
            }
            if (cy  >= 490-radius || cy  <= 0) {
                velY *= -1;
            }
        }

        public void collision(Balls o) {
            Area areaA = new Area(oval);
            areaA.intersect(new Area(o.oval));
            if (!areaA.isEmpty()) {
                velX *= -1;
            }
        }

        void changeVel(JSlider sl) {
            if (velX < 0) {
                velX = -sl.getValue();
            } else {
                velX = sl.getValue();
            }
            if(velY < 0) {
               velY = -sl.getValue();
            } else {
                velY = sl.getValue();
            }
        }

        void changeSize(JSlider sl) {
            radius = sl.getValue();
        }

        void render(Graphics2D g) {
            oval = new Ellipse2D.Double(cx, cy, radius, radius);
            g.fill(oval);
        }
    }
} 
import java.awt.geom.Area;
import java.util.ArrayList;

public class Collisions {

    public boolean collision(ArrayList<GraphicsDemo.Balls> balls, Shape o1) {
        Area areaA = new Area(o1);
        for (GraphicsDemo.Balls ball : balls) {
            areaA.intersect(new Area(ball.oval));
            return !areaA.isEmpty();
        }
        return true;
    }
}
import java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.Area;
导入java.awt.geom.Ellipse2D;
导入java.util.ArrayList;
公共类GraphicsDemo扩展JPanel实现ActionListener{
public ArrayList balls=new ArrayList();
图像空间图像;
JSlider sl,sl2;
定时器;
公共int h、w、s、尺寸;
公共图形DEMO(整数宽度、整数高度、整数速度、,
整数大小,JSlider幻灯片,JSlider幻灯片2){
h=高度;w=宽度;
sl=幻灯片;sl2=幻灯片2;
s=速度;尺寸=尺寸;
init();
spaceImage=new-ImageIcon(“C:\\Users\\admin\\Downloads\\space.jpg”).getImage();
定时器=新定时器(100,本);
timer.start();
}
公共void init(){
对于(int i=0;i<10;i++){
intx=(int)((Math.random()*700)+1);
int y=(int)((Math.random()*400)+1);
如果(i%2==0){
添加(新球(尺寸,x,y,10,-10));
}否则{
添加(新球(尺寸,x,y,-10,10));
}
}
}
公共组件(图形g){
超级组件(g);
这个.背景(颜色.黑色);
Graphics2D g2D=(Graphics2D)g;
g2D.drawImage(spaceImage,0,0735490,空);
GradientPaint=新的GradientPaint(0,0,Color.RED,420,0,Color.BLUE);
g2D.setPaint(油漆);
用于(球:球){
球体渲染(g2D);
}
}
@凌驾
已执行的公共无效操作(操作事件e){
用于(球:球){
ball.checkBounds();
球型变速杆(sl);
改变大小的球(sl2);
用于(球b:球){
//碰撞(b);
}
}
重新油漆();
}
静态类球{
椭圆形;
私有整数半径;
私人int cx;
私密性;
私人int velX,velY;
球(整数r,整数x,整数y,整数velX,整数velY){
这个半径=r;
这是cx=x;
这个.cy=y;
this.velX=velX;
这是一个很好的例子;
椭圆=新椭圆2d.Double(cx,cy,半径,半径);
}
void checkBounds(){
cx+=velX;
cy+=1;

如果(cx>=735 radius | | cx=490 radius | | cy碰撞类中存在错误:

import java.awt.geom.Area;
import java.util.ArrayList;

public class Collisions {

    public boolean collision(ArrayList<GraphicsDemo.Balls> balls, Shape o1) {
        Area areaA = new Area(o1);
        for (GraphicsDemo.Balls ball : balls) {
            areaA.intersect(new Area(ball.oval));
            return !areaA.isEmpty();  // HERE
        }
        return true;
    }
}
导入java.awt.geom.Area;
导入java.util.ArrayList;
公共类冲突{
公共布尔碰撞(ArrayList球,形状o1){
面积A=新面积(o1);
用于(GraphicsDemo.Balls球:球){
区域A.相交(新区域(球形、椭圆形));
return!areaA.isEmpty();//此处
}
返回true;
}
}

您的循环在第一步返回一个没有任何断言的值!

首先,不要从中更新组件的状态,在
paintComponent
方法中,您正在为自己设置一个高CPU负载,因为这可能会触发新的绘制过程。不要将滑块传递给球,这会暴露实现细节和风险严格修改组件,最好直接设置滑块的值