我正在使用 aJFrame
设置纸牌游戏,使用扩展的卡片,JLabel
以便可以在屏幕上拖动它们。但是,我的一个要求是我能够双击一张牌,它可以捕捉到 4 叠 A。这不是问题。造成问题的原因是我将它设置在一个数组中,以便 A 会到达与 A 的花色相对应的位置,然后如果将一张牌拖到那里,我会重新排列这些位置。如果双击,则 A 必须先到第一个位置(从左边开始),然后是第二个,依此类推。我曾计划用getComponentAt()
找出第一个位置是什么,如果我可以将 ace 放在那里,如果不能,那么我会转到第二个位置,依此类推。出于某种原因,即使我将参数硬编码到getComponentAt()
到我知道有一个组件的地方,它仍然返回 null。
这是我的代码的相关部分:
Container contentPane = getContentPane();
contentPane.setLayout(null);
...
for(int i = 0; i < 4; i++)
{
aces[i] = new Card();
aces[i].setBounds((i * 75) + 475, 25, 75, 100);
contentPane.add(aces[i]);
aces[i].setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
aces[i].setSuit(i + 1);
}
System.out.println(contentPane.getComponentAt(475, 25));
null
每次都会返回,无论我将坐标放在组件的哪个位置。有什么解释吗?
*更新的 SSCCE:这是主要课程,纸牌:
import java.util.*;
import javax.swing.*;
import java.awt.*;
public class Solitaire extends JFrame
{
private Container contentPane;
private Card aces[];
public static void main(String args[])
{
Solitaire frame = new Solitaire();
frame.setVisible(true);
}
public Solitaire()
{
super();
contentPane = getContentPane();
contentPane.setLayout(null);
contentPane.setBackground(Color.GREEN.darker().darker());
setTitle("Solitaire");
setSize(800,800);
setResizable(false);
setLocation(250, 50);
setDefaultCloseOperation(EXIT_ON_CLOSE);
play();
}
public void play()
{
contentPane.removeAll();
aces = new Card[4];
for(int i = 0; i < 4; i++)
{
aces[i] = new Card(0,i + 1);
aces[i].setBounds((i * 75) + 475, 25, 75, 100);
contentPane.add(aces[i]);
aces[i].setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
}
for(int i = 0; i < contentPane.getComponents().length; i++)
System.out.println(contentPane.getComponents()[i]);
System.out.println(contentPane.getComponentAt(475, 25));
repaint();
}
}
这是班级卡:
import javax.swing.*;
public class Card extends JLabel
{
private int numb;
private int value;
private int suit;
public Card(int n, int s)
{
super();
numb = n;
suit = s;
}
}
这是为我运行的,如果您需要更多来解决问题,请发表评论。