我正在编写一个简单的基于卡片的游戏,其中玩家在屏幕底部有一手牌。当他们点击卡片时,卡片会在窗口上移动到“弃牌堆”位置。
我的动画动画让我满意,但问题是卡片按钮在其他面板上移动时会消失。手牌位于内容窗格的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);
}
}