有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

动画JAVA JPanel同时滑出和滑入

我在移动JPanel时遇到问题

我有一个窗口400x600和一个JPanel(红色)100x100

public class RulettModel {
    private int num;

    public void Slide() {
        num = num + 1;
        if(num > 600) {
            num = -100;
        }
    }

    public int getNum() {
        return num;
    }
}

class RulettListener implements ActionListener{
    Timer tm = new Timer(1, this);

   @Override
    public void actionPerformed(ActionEvent e) {
        tm.start();
        int y = 0;

        theModel.Slide();

        theView.setNewLocationOfPiros(theModel.getNum(), y);         
    }
}

void setNewLocationOfJpanel(int x, int y) {
    JPanel1.setLocation(x,y);
 }

这个代码是我的代码的一部分,这是需要在这里,这很好,我的JPanel是滑出窗口的右侧,当它的窗口宽度开始从-100回来,所以从左侧

我遇到的问题是: 我希望我的JPanel在右侧完全消失之前从左侧进入

所以,如果面板的一半已经熄灭了,那么那一半应该已经出现在左边了,所以我的面板应该一次在两个位置,一半在这里,一半在那里,这有可能吗

任何其他解决这件事的建议


共 (2) 个答案

  1. # 1 楼答案

    在编写以下代码之前,我使用Microsoft Paint制作了7个不同颜色的矩形,60像素宽,90像素高。你看jf.setSize(186,120)我只是通过反复试验得到这些值。我刚才猜的timerDelay是一个合适的值。至于原因,所有其他价值观都应该是显而易见的

    所有这一切的关键是,在TimerActionListener中,我只需获取每个分幅[I]的位置(),将5添加到x坐标,并在达到300时将其重置为-120,然后再次设置位置(int,int)

    package SlidingTiles;
    
    import ...;
    
    public class Main 
    {
        private static int timerDelay = 100;
        private static Timer t = new Timer(timerDelay, new TimerActionListener());
    
        private static JFrame jf = new JFrame();
        private static JPanel jp = new JPanel();
        private static String[] colors = { "blue", "brown", "green", "grey", "purple", "red", "yellow" };
        private static JLabel[] tiles = new JLabel[7];
    
        public static void main(String[] args) 
        {
    
    
            for(int i=0; i<7; ++i)
            {
                tiles[i] = new JLabel(new ImageIcon("tiles/"+colors[i]+".jpg"));
                tiles[i].setBounds(-120+60*i,0,60,90);
                jf.add(tiles[i]);
            }
    
            jf.add(jp);
            jf.setSize(186,120);
            jf.setResizable(false);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            t.start();
        }
    
        public static class TimerActionListener implements ActionListener
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                for(int i=0; i<7; ++i)
                {
                    Point p = tiles[i].getLocation();
                    int newX = (int) p.getX()+5;
                    if(newX == 300)
                        newX = -120;
    
                    tiles[i].setLocation(newX, 0);
                }
            }
        }
    }
    
  2. # 2 楼答案

    我想你需要两个JPanel。那我就

    public class RulettModel {
        private int num1, num2;
    
        public void Slide() {
            num1 = num1 + 1;
            if(num1 > 600) {
                num2 = 500-num1;
            }
        }
    
        public int getNum1() {
            return num1;
        }
    
        public int getNum2() {
            return num2;
        }
    }
    

    并且有setNewLocOfJPanel1(int, int)setNewLocOfJPanel2(int, int)方法