在其他面板前移动按钮

时间:2016-08-07 22:05:57

标签: java swing animation layout

我正在编写一个简单的基于卡片的游戏,其中玩家在屏幕底部有一手牌。当他们点击卡片时,卡片会在窗口上移动到“弃牌堆”位置。

我的动画动画让我满意,但问题是卡片按钮在其他面板上移动时会消失。手牌位于内容窗格的borderlayout的PAGE_END部分,丢弃堆位于屏幕的顶部 - 因此卡片必须移过CENTER部分才能到达目的地。但它在后面 CENTER面板,而我希望它在前面。

这可能吗?我已经尝试过调查LayeredPanes但是这似乎要求我的所有组件都直接在一个容器内,而它们不是(因为我在内容面板的底部有另一个面板)。

我用两个类写了最简单的问题版本。

主要班级:

package moveButton;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class MoveButton extends JFrame implements ActionListener {

    public JPanel view;
    public MovingButton mover;
    public static MoveButton instance;

    public static void main(String[] args) {
        instance = new MoveButton();
    }

    public MoveButton() {

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(500,500);
        this.setVisible(true);

        view = new JPanel();
        view.setLayout(new BorderLayout());

        JPanel buttonPanel = new JPanel();
        view.add(buttonPanel, BorderLayout.PAGE_END);

        mover = new MovingButton("Move");
        mover.addActionListener(this);
        buttonPanel.add(mover);

        this.setContentPane(view);

        this.repaint();
        this.revalidate();



    }

    @Override
    public void actionPerformed(ActionEvent e) {
        MoveButton.instance.mover.timer.start();
    }

}

按钮类:

package moveButton;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.Timer;

public class MovingButton extends JButton implements ActionListener {

    public Timer timer;
    public static final int X_INC = 5;
    public static final int Y_INC = -5;
    public int xPos;
    public int yPos;



public MovingButton(String text) {
        super(text);
        timer = new Timer(30, this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        this.move();
        MoveButton.instance.repaint();

        if(xPos == 100 || yPos == 100) {
            timer.stop();
        }

    }

    public void move() {
        xPos = xPos + X_INC;
        yPos = yPos + Y_INC;
    }

    public void paint(Graphics g) {
        g.translate(xPos, yPos);
        super.paint(g);
    }

}

0 个答案:

没有答案