Java 我怎样才能把球打到;“反弹”;从我的JSlider上?(我已经让它反弹了)

Java 我怎样才能把球打到;“反弹”;从我的JSlider上?(我已经让它反弹了),java,swing,animation,jframe,jslider,Java,Swing,Animation,Jframe,Jslider,我在这个网站上搜索过,找不到任何关于从JSlider上弹起球的帖子。我修改了代码,使球从打开的窗口侧面反弹,并通过JSlider面板加速,但球(圆圈)落在JSlider面板后面。当它在窗口周围弹跳时,它通过JSLIDER,并且我希望球能够考虑JSlider作为窗口的底部。下面显示的代码是我的构造函数 import java.awt.*; import java.awt.event.*; import javax. swing. *; import javax.swing.event.*; pub

我在这个网站上搜索过,找不到任何关于从JSlider上弹起球的帖子。我修改了代码,使球从打开的窗口侧面反弹,并通过JSlider面板加速,但球(圆圈)落在JSlider面板后面。当它在窗口周围弹跳时,它通过JSLIDER,并且我希望球能够考虑JSlider作为窗口的底部。下面显示的代码是我的构造函数

import java.awt.*;
import java.awt.event.*;
import javax. swing. *;
import javax.swing.event.*;
public class SpeedControlPanel extends JPanel
{

  private final int WIDTH = 600;
  private final int HEIGHT = 400;
  private final int BALL_SIZE = 50;
  private Circle bouncingBall; // the object that moves
  private Timer timer;
  private int moveX, moveY; // increment to move each time
  private JPanel pSpeeder;
  private JSlider sSpeeder;
  private JLabel lSpeeder;
  Dimension height;
  // --------------------------------------------
  // Sets up the panel, including the timer
  // for the animation
  // --------------------------------------------


      public SpeedControlPanel ()
      {
        timer = new Timer(30, new ReboundListener());
        this.setLayout (new BorderLayout());
        bouncingBall = new Circle(BALL_SIZE);
        moveX = moveY = 5;
        // Set up a slider object here
        setPreferredSize (new Dimension (WIDTH, HEIGHT));
        setBackground(Color.black);
        lSpeeder = new JLabel("Timer Delay");
        lSpeeder.setAlignmentX(Component.LEFT_ALIGNMENT);

        sSpeeder = new JSlider(JSlider.HORIZONTAL, 0, 200, 30);
        sSpeeder.setMajorTickSpacing(40);
        sSpeeder.setMinorTickSpacing(10);
        sSpeeder.setPaintTicks(true);
        sSpeeder.setPaintLabels(true);
        sSpeeder.setAlignmentX(Component.LEFT_ALIGNMENT);

        sSpeeder.addChangeListener(new SlideListener());

        pSpeeder = new JPanel();
        pSpeeder.add(lSpeeder);
        pSpeeder.add(sSpeeder);

        add(pSpeeder, BorderLayout.SOUTH);
        timer.start();
      }

  // ---------------------
  // Draw the ball
  // ---------------------
      public void paintComponent (Graphics page)
      {
        super.paintComponent (page);
        bouncingBall.draw(page);
      }
  // ***************************************************
  // An action listener for the timer
  // ***************************************************
  public class ReboundListener implements ActionListener
  {
  // ----------------------------------------------------
  // actionPerformed is called by the timer -- it updates
  // the position of the bouncing ball
  // ----------------------------------------------------
      public void actionPerformed(ActionEvent action)
          {

          bouncingBall.move(moveX, moveY);
          // change direction if ball hits a side
          int x = bouncingBall.getX();
          int y = bouncingBall.getY();


          int slidePanelHt = pSpeeder.getSize().height; 

          if (x < 0 || x >= WIDTH - BALL_SIZE)
          moveX = moveX * -1;
          if (y <= 0 || y >= HEIGHT - BALL_SIZE)
          moveY = moveY * -1;
          repaint();
          }
  }
  // ***************************************************
  // A change listener for the slider.
  // ***************************************************
      private class SlideListener implements ChangeListener
          {
          // ------------------------------------------------
          // Called when the state of the slider has changed;
          // resets the delay on the timer.
          // ------------------------------------------------
              public void stateChanged (ChangeEvent event)
              {
                timer.setDelay(sSpeeder.getValue());
              }
          }
}
import java.awt.*;
导入java.awt.event.*;
导入javax。摇摆。*;
导入javax.swing.event.*;
公共类速度控制面板扩展JPanel
{
专用最终整数宽度=600;
私人最终内部高度=400;
私人最终整型球尺寸=50;
private Circle bouncingBall;//移动的对象
私人定时器;
private int moveX,moveY;//每次移动的增量
私人JPanel pSpeeder;
私用JSlider sSpeeder;
私用JLabel-lSpeeder;
尺寸高度;
// --------------------------------------------
//设置面板,包括计时器
//对于动画
// --------------------------------------------
公共速度控制面板()
{
计时器=新计时器(30,新侦听器());
this.setLayout(新的BorderLayout());
bouncingBall=新圆(球大小);
moveX=moveY=5;
//在此处设置滑块对象
setPreferredSize(新尺寸(宽度、高度));
挫折背景(颜色:黑色);
lSpeeder=新的JLabel(“计时器延迟”);
lSpeeder.setAlignmentX(组件左对齐);
sSpeeder=新的JSlider(JSlider.HORIZONTAL,0,200,30);
sSpeeder.setMajorTickSpacing(40);
sSpeeder.setMinorTickSpacing(10);
sSpeeder.setPaintTicks(真);
sSpeeder.setPaintLabels(真);
sSpeeder.setAlignmentX(组件左对齐);
sSpeeder.addChangeListener(新的SlideListener());
pspeder=newjpanel();
pSpeeder.add(lSpeeder);
pSpeeder.add(sSpeeder);
添加(PSpeder,BorderLayout.SOUTH);
timer.start();
}
// ---------------------
//抽签
// ---------------------
公共组件(图形页)
{
super.paintComponent(第页);
弹跳球。绘图(第页);
}
// ***************************************************
//计时器的操作侦听器
// ***************************************************
公共类侦听器实现ActionListener
{
// ----------------------------------------------------
//actionPerformed由计时器调用--它会更新
//弹跳球的位置
// ----------------------------------------------------
已执行的公共无效操作(操作事件操作)
{
弹跳球。移动(moveX,moveY);
//如果球撞到一边,改变方向
int x=bouncingBall.getX();
int y=bouncingBall.getY();
int slidePanelHt=pspeder.getSize().height;
如果(x<0 | | x>=宽度-球大小)
moveX=moveX*-1;
如果(y=高度-球尺寸)
moveY=moveY*-1;
重新油漆();
}
}
// ***************************************************
//滑块的更改侦听器。
// ***************************************************
私有类SlideListener实现ChangeListener
{
// ------------------------------------------------
//当滑块的状态已更改时调用;
//重置计时器上的延迟。
// ------------------------------------------------
公共无效状态已更改(ChangeEvent事件)
{
timer.setDelay(sSpeeder.getValue());
}
}
}
有没有办法修改JSlider的宽度/高度,以使球弹离它

  • 创建一个包含所有内容的包装器JPanel,并给它一个BorderLayout
  • 将图形/动画JPanel放入BorderLayout.CENTER位置的包装器中
  • 将JSlider放入BorderLayout.PAGE_END位置的包装器JPanel中
  • 将包装器添加到GUI,而不是绘图/动画JPanel

  • 完成

    我建议通过实现将gui与其控件分离。
    具有保存视图(gui)需要的所有信息的模型:

    具有使用模型显示gui的视图。请注意,滑块和动画位于两个独立的
    JPanel
    s上,建议如下:

    总而言之:请参见以下内容:它添加了一个控制模型和视图的控制器。
    为了方便和简单,可以将以下代码复制粘贴到名为
    BouncingBall.java
    的文件中,然后运行

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;   
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    import javax.swing.Timer;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    /*
     * The controller wires the view and model, and does the processing.
     */
    public class BouncingBall {
    
        private final int BALL_SIZE = 25;
        private int moveX =5, moveY =5; // increment to move each time
        private final Timer timer;
        private final Model model;
        private JPanel view;
    
        BouncingBall() {
    
            model = new Model(BALL_SIZE);
            timer = new Timer(model.getDelay(), new ReboundListener());
            makeAndShowGui();
            timer.start();
        }
    
        private void makeAndShowGui() {
            JFrame window = new JFrame();
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            view = new View(model);
            window.add(view);
            window.pack();
            window.setResizable(false);
            window.setVisible(true);
        }
    
        private void updateGui() {
            // change direction if ball hits a side
            int x = model.getX();
            int y = model.getY();
    
            if (x < 0 || x >= model.getWidth() - model.getRaduis()*2) {
                moveX = moveX * -1;
            }
    
            if (y <= 0 || y >= model.getHeiht() - model.getRaduis()*2) {
                moveY = moveY * -1;
            }
    
            model.setX(x+moveX);
            model.setY(y+moveY);
            timer.setDelay(model.getDelay()); //update timer
            view.repaint();
        }
    
        // ***************************************************
        // An action listener for the timer
        // ***************************************************
        public class ReboundListener implements ActionListener  {
    
            // ----------------------------------------------------
            // actionPerformed is called by the timer -- it updates
            // the position of the bouncing ball
            // ----------------------------------------------------
            @Override
            public void actionPerformed(ActionEvent action) {
                updateGui();
            }
        }
    
        public static void main(String[] args) {
            new BouncingBall();
        }
    }
    
    /*
     * The model contains the information for the view and information from the view
     * The model is independent of the user interface.
     */
    class Model{
    
        private final int WIDTH = 600;
        private final int HEIGHT = 400;
    
        private int x,y, delay;
        private final int radius;
    
        Model(int radius) {
            this.radius = radius;
            x= radius;  y= radius; delay = 30; //default values
        }
    
        void move(int moveX, int moveY) {
            x += moveX; y+= moveY;
        }
    
        int getX() { return x;  }
        void setX(int x) { this.x = x; }
    
        int getY() {return y;}
        void setY(int y) { this.y = y; }
    
        int getRaduis() {return radius;}
    
        int getDelay() {return delay;}
    
        void setDelay(int delay) {this.delay = delay;}
    
        int getWidth() {return WIDTH;}
    
        int getHeiht() {return HEIGHT;  }
    }
    
    /*
     * View is just that: a dumb as possible display 
     */
    class View extends JPanel {
    
        View(Model model) {
            setLayout (new BorderLayout());
            add(new BallPane(model));                          //as explained in Hovercraft Full Of Eels
            add(new SliderPane(model), BorderLayout.PAGE_END); //answer
        }
    
        class BallPane extends JPanel {
    
            private final Model model;
    
            BallPane(Model model) {
                this.model = model;
                setPreferredSize (new Dimension (model.getWidth(), model.getHeiht()));
                setBackground(Color.black);
            }
    
            // ---------------------
            // Draw the ball
            // ---------------------
            @Override
            public void paintComponent (Graphics page)  {
                super.paintComponent (page);
                page.setColor(Color.CYAN);
                page.fillOval(model.getX(), model.getY(), model.getRaduis()*2, model.getRaduis()*2);
            }
        }
    
        class SliderPane extends JPanel {
    
            private final Model model;
            private final JSlider sSpeeder;
            SliderPane(Model model) {
                this.model = model;
                sSpeeder = new JSlider(JSlider.HORIZONTAL, 0, 200, 30);
                sSpeeder.setMajorTickSpacing(40);
                sSpeeder.setMinorTickSpacing(10);
                sSpeeder.setPaintTicks(true);
                sSpeeder.setPaintLabels(true);
                sSpeeder.setAlignmentX(Component.LEFT_ALIGNMENT);
                sSpeeder.addChangeListener(new SlideListener());
                add(sSpeeder);
            }
    
            // ***************************************************
            // A change listener for the slider.
            // ***************************************************
            private class SlideListener implements ChangeListener
            {
                // ------------------------------------------------
                // Called when the state of the slider has changed;
                // resets the delay on the timer.
                // ------------------------------------------------
                @Override
                public void stateChanged (ChangeEvent event)
                {
                    model.setDelay(sSpeeder.getValue());
                }
            }
        }
    }
    
    导入java.awt.BorderLayout;
    导入java.awt.Color;
    导入java.awt.Component;
    导入java.awt.Dimension;
    导入java.awt.Graphics;
    导入java.awt.event.ActionEvent;
    导入java.awt.event.ActionListener;
    导入javax.swing.JFrame;
    导入javax.swing.JPanel;
    导入javax.swing.JSlider;
    导入javax.swing.Timer;
    导入javax.swing.event.ChangeEvent;
    导入javax.swing.event.ChangeListener;
    /*
    *控制器连接视图和模型,并进行处理。
    */
    公开课弹跳球{
    私人最终整型球尺寸=25;
    private int moveX=5,moveY=5;//每次移动的增量
    私人最终定时器;
    私有最终模型;
    私人JPanel视图;
    弹跳球{
    型号=新型号(球尺寸);
    计时器=新计时器(model.getDelay(),new-listener());
    makeAndShowGui();
    timer.start();
    }
    私有void makeAndShowGui(){
    JFrame窗口=新JFrame();
    setDefaultCloseOperation(JFrame.EXIT_
    
    /*
     * View is just that: a dumb as possible display 
     */
    class View extends JPanel {
    
        View(Model model) {
            setLayout (new BorderLayout());
            add(new BallPane(model));                          //as explained in Hovercraft Full Of Eels
            add(new SliderPane(model), BorderLayout.PAGE_END); //answer
        }
    
        class BallPane extends JPanel {
    
            private final Model model;
    
            BallPane(Model model) {
                this.model = model;
                setPreferredSize (new Dimension (model.getWidth(), model.getHeiht()));
                setBackground(Color.black);
            }
    
            // ---------------------
            // Draw the ball
            // ---------------------
            @Override
            public void paintComponent (Graphics page)  {
                super.paintComponent (page);
                page.setColor(Color.CYAN);
                page.fillOval(model.getX(), model.getY(), model.getRaduis()*2, model.getRaduis()*2);
            }
        }
    
        class SliderPane extends JPanel {
    
            private final Model model;
            private final JSlider sSpeeder;
            SliderPane(Model model) {
                this.model = model;
                sSpeeder = new JSlider(JSlider.HORIZONTAL, 0, 200, 30);
                sSpeeder.setMajorTickSpacing(40);
                sSpeeder.setMinorTickSpacing(10);
                sSpeeder.setPaintTicks(true);
                sSpeeder.setPaintLabels(true);
                sSpeeder.setAlignmentX(Component.LEFT_ALIGNMENT);
                sSpeeder.addChangeListener(new SlideListener());
                add(sSpeeder);
            }
    
            // ***************************************************
            // A change listener for the slider.
            // ***************************************************
            private class SlideListener implements ChangeListener
            {
                // ------------------------------------------------
                // Called when the state of the slider has changed;
                // resets the delay on the timer.
                // ------------------------------------------------
                @Override
                public void stateChanged (ChangeEvent event)
                {
                    model.setDelay(sSpeeder.getValue());
                }
            }
        }
    }
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;   
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    import javax.swing.Timer;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    /*
     * The controller wires the view and model, and does the processing.
     */
    public class BouncingBall {
    
        private final int BALL_SIZE = 25;
        private int moveX =5, moveY =5; // increment to move each time
        private final Timer timer;
        private final Model model;
        private JPanel view;
    
        BouncingBall() {
    
            model = new Model(BALL_SIZE);
            timer = new Timer(model.getDelay(), new ReboundListener());
            makeAndShowGui();
            timer.start();
        }
    
        private void makeAndShowGui() {
            JFrame window = new JFrame();
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            view = new View(model);
            window.add(view);
            window.pack();
            window.setResizable(false);
            window.setVisible(true);
        }
    
        private void updateGui() {
            // change direction if ball hits a side
            int x = model.getX();
            int y = model.getY();
    
            if (x < 0 || x >= model.getWidth() - model.getRaduis()*2) {
                moveX = moveX * -1;
            }
    
            if (y <= 0 || y >= model.getHeiht() - model.getRaduis()*2) {
                moveY = moveY * -1;
            }
    
            model.setX(x+moveX);
            model.setY(y+moveY);
            timer.setDelay(model.getDelay()); //update timer
            view.repaint();
        }
    
        // ***************************************************
        // An action listener for the timer
        // ***************************************************
        public class ReboundListener implements ActionListener  {
    
            // ----------------------------------------------------
            // actionPerformed is called by the timer -- it updates
            // the position of the bouncing ball
            // ----------------------------------------------------
            @Override
            public void actionPerformed(ActionEvent action) {
                updateGui();
            }
        }
    
        public static void main(String[] args) {
            new BouncingBall();
        }
    }
    
    /*
     * The model contains the information for the view and information from the view
     * The model is independent of the user interface.
     */
    class Model{
    
        private final int WIDTH = 600;
        private final int HEIGHT = 400;
    
        private int x,y, delay;
        private final int radius;
    
        Model(int radius) {
            this.radius = radius;
            x= radius;  y= radius; delay = 30; //default values
        }
    
        void move(int moveX, int moveY) {
            x += moveX; y+= moveY;
        }
    
        int getX() { return x;  }
        void setX(int x) { this.x = x; }
    
        int getY() {return y;}
        void setY(int y) { this.y = y; }
    
        int getRaduis() {return radius;}
    
        int getDelay() {return delay;}
    
        void setDelay(int delay) {this.delay = delay;}
    
        int getWidth() {return WIDTH;}
    
        int getHeiht() {return HEIGHT;  }
    }
    
    /*
     * View is just that: a dumb as possible display 
     */
    class View extends JPanel {
    
        View(Model model) {
            setLayout (new BorderLayout());
            add(new BallPane(model));                          //as explained in Hovercraft Full Of Eels
            add(new SliderPane(model), BorderLayout.PAGE_END); //answer
        }
    
        class BallPane extends JPanel {
    
            private final Model model;
    
            BallPane(Model model) {
                this.model = model;
                setPreferredSize (new Dimension (model.getWidth(), model.getHeiht()));
                setBackground(Color.black);
            }
    
            // ---------------------
            // Draw the ball
            // ---------------------
            @Override
            public void paintComponent (Graphics page)  {
                super.paintComponent (page);
                page.setColor(Color.CYAN);
                page.fillOval(model.getX(), model.getY(), model.getRaduis()*2, model.getRaduis()*2);
            }
        }
    
        class SliderPane extends JPanel {
    
            private final Model model;
            private final JSlider sSpeeder;
            SliderPane(Model model) {
                this.model = model;
                sSpeeder = new JSlider(JSlider.HORIZONTAL, 0, 200, 30);
                sSpeeder.setMajorTickSpacing(40);
                sSpeeder.setMinorTickSpacing(10);
                sSpeeder.setPaintTicks(true);
                sSpeeder.setPaintLabels(true);
                sSpeeder.setAlignmentX(Component.LEFT_ALIGNMENT);
                sSpeeder.addChangeListener(new SlideListener());
                add(sSpeeder);
            }
    
            // ***************************************************
            // A change listener for the slider.
            // ***************************************************
            private class SlideListener implements ChangeListener
            {
                // ------------------------------------------------
                // Called when the state of the slider has changed;
                // resets the delay on the timer.
                // ------------------------------------------------
                @Override
                public void stateChanged (ChangeEvent event)
                {
                    model.setDelay(sSpeeder.getValue());
                }
            }
        }
    }