我知道这里有很多关于使用绝对布局定位组件的问题,但它们似乎没有回答我的问题。
我正致力于在java中创建纸牌游戏,以更好地学习GUI组件。我似乎理解我正在使用的各种ActionListener
类,但是我在窗口中将组件定位到我想要的位置时遇到了问题。
我试图以类似基本纸牌布局的格式设置窗口(甲板,弃牌堆,顶部有4个套装堆叠,下面有7个单人纸牌堆叠)。我的思维过程是我需要在我的JFrame组件中使用绝对布局来手动将不同的堆栈元素放在应该去的地方(也许这不是最好的方法吗?)。在这样做的过程中,我尝试过使用setLocation(x, y)
,setLocation(Point)
,setBounds(x, y, width, height)
等,似乎没有任何效果。我只是得到一个空白的窗口。
以下是我的代码尝试在窗口中手动放置组件的示例:
public class SolitaireTable extends JFrame {
public static final int SUIT_STACK_CNT = 4;
public static final int SOL_STACK_CNT = 7;
public static final Point DECK_POS = new Point(5,5);
public static final Point DISCARD_POS = new Point(73+10, 5); //73 is width of card images and 10 gives it a 5 px border to left and right
public static final Point SUIT_STACK_POS = new Point(DISCARD_POS.x + 73 + 92, 5);
public static final Point SOL_STACK_POS = new Point(DECK_POS.x, DECK_POS.y + 97 + 5); //97 is heigh of card image. 5 gives it a border of 5
public SolitaireTable()
{
setLayout(null);
ImageIcon cardImg = new ImageIcon("images/2c.gif");
Card card1 = new Card(cardImg);
add(card1);
card1.setBounds(50, 50, card1.getWidth(), card1.getHeight());
}
public static void main(String[] args)
{
SolitaireTable table = new SolitaireTable();
table.setTitle("Solitaire");
table.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
table.setVisible(true);
table.setSize(800, 600);
}
}
public class Card extends JComponent {
private ImageIcon img;//current image displayed (either front or back of card)
private Point coords;
private String suit;
private int face; //use ints instead of strings to make descending face pattern calculations easier. 0 = ace, 1= 2, 10 = j, 12 = k, etc
private String color;
private boolean revealed; //whether see face or back of card
private ImageIcon frontImage; //image of card's face side (set in constructor)
public Card(ImageIcon img){
this.img = img;
}
public void moveTo(Point p) {
coords = p;
}
//================================================================= getWidth
public int getWidth() {
return img.getIconWidth();
}
//================================================================ getHeight
public int getHeight() {
return img.getIconHeight();
}
}
我已经在互联网上搜索了几天,试图找出如何在绝对布局中定位组件但却找不到多少东西。任何帮助将不胜感激。感谢。
答案 0 :(得分:2)
您使用ImageIcon创建了Card类,但是您从不在任何地方绘制图标,因此没有任何内容可以绘制,并且您将获得一个空屏幕。
您需要向您的班级添加绘画代码。有关更多信息和工作示例,请参阅Custom Painting上Swing教程中的部分。
或者您可能创建了一个JLabel并将Icon添加到标签中,然后将标签添加到组件中。 (如果使用这种方法,请不要忘记设置卡组件的布局管理器。)
或者你可以用Icon创建一个JLabel。然后你将扩展JLabel,而不是JComponent来添加你的自定义方法。
答案 1 :(得分:0)
您使用的是绝对布局吗?
Absolute Layout is DEPRECATED
..... 看一看
here
强>
来自文档:与没有绝对定位的其他类型的布局相比,绝对布局不够灵活且难以维护。
然而 ,如果符合您的特殊目的,请使用它。
您可以按照此处所述使用RelativeLayouts
:
Set the absolute position of a view