我正在尝试用java编写一个卡片游戏,我需要在卡片下面放置一些按钮。我已经调查了布局管理器,但我不知道如何在我正在尝试的上下文中使用它们。 我的代码如下(我也有一个卡类,但工作正常):
public class Elevens extends Frame implements MouseListener, ActionListener
{
private BufferedImage buffer;`
Graphics2D h;
private ArrayList<card> randDeck;
private Random generator;
private card currentStuff[] = new card[9];
private ArrayList<card> deck;
private boolean card1, card2, card3, card4, card5, card6, card7, card8, card9;
private JButton replace;
public Elevens()
{
JFrame frame = new JFrame("Elevens");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
generator = new Random();
deck = new ArrayList<card>();
randDeck = new ArrayList<card>();
addMouseListener(this);
replace = new JButton("Replace");
replace.setActionCommand("replace");
replace.addActionListener(this);
frame.add(replace);
card1 = false;
card2 = false;
card3 = false;
card4 = false;
card5 = false;
card6 = false;
card7 = false;
card8 = false;
card9 = false;
for(int i = 1; i < 53; i++)
{
card c = new card();
if(i < 14)
{
c.setSuit('S');
c.setValue(i);
deck.add(c);
}
else if(i < 27 && i >= 14)
{
c.setSuit('D');
c.setValue(i - 13);
deck.add(c);
}
else if(i < 40 && i >= 27)
{
c.setSuit('C');
c.setValue(i - 26);
deck.add(c);
}
else
{
c.setSuit('H');
c.setValue(i - 39);
deck.add(c);
}
}
while(deck.size() > 0)
{
int index = generator.nextInt(deck.size());
randDeck.add(deck.get(index));
deck.remove(index);
}
for(int i = 0; i < 9; i++)
{
currentStuff[i] = randDeck.get(i);
randDeck.remove(i);
}
}
public static void main(String[]arg)
{
Elevens e = new Elevens();
e.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
e.show();
}
public void paint(Graphics g)
{
h = (Graphics2D)g;
g.setColor(new Color(0, 51, 25));
g.fillRect(100, 300, 500, 500);
for(int i = 0; i < 9; i++)
{
int x = (i * 100) + 150, y = 360;
card c = currentStuff[i];
if(i > 2)
{
x = (i - 3) * 100 + 150;
y = 470;
}
if(i > 5)
{
x = (i - 6) * 100 + 150;
y = 580;
}
c.drawCard(x, y, 80, 100, g, this);
}
g.setColor(Color.RED);
h.setStroke(new BasicStroke(3));
if(card1)
{
g.drawRect(150, 360, 80, 100);
}
if(card2)
{
g.drawRect(250, 360, 80, 100);
}
if(card3)
{
g.drawRect(350, 360, 80, 100);
}
if(card4)
{
g.drawRect(150, 470, 80, 100);
}
if(card5)
{
g.drawRect(250, 470, 80, 100);
}
if(card6)
{
g.drawRect(350, 470, 80, 100);
}
if(card7)
{
g.drawRect(150, 580, 80, 100);
}
if(card8)
{
g.drawRect(250, 580, 80, 100);
}
if(card9)
{
g.drawRect(350, 580, 80, 100);
}
}
public void mousePressed(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
int x = e.getX(), y = e.getY();
if( x >= 150 && y >= 360 && x < 230 && y < 460)
{
if(card1)
{
card1 = false;
}
else
{
card1 = true;
}
}
if( x >= 250 && y >= 360 && x < 330 && y < 460)
{
if(card2)
{
card2 = false;
}
else
{
card2 = true;
}
}
if( x >= 350 && y >= 360 && x < 430 && y < 460)
{
if(card3)
{
card3 = false;
}
else
{
card3 = true;
}
}
if( x >= 150 && y >= 470 && x < 230 && y < 570)
{
if(card4)
{
card4 = false;
}
else
{
card4 = true;
}
}
if( x >= 250 && y >= 470 && x < 330 && y < 570)
{
if(card5)
{
card5 = false;
}
else
{
card5 = true;
}
}
if( x >= 350 && y >= 470 && x < 430 && y < 570)
{
if(card6)
{
card6 = false;
}
else
{
card6 = true;
}
}
if( x >= 150 && y >= 580 && x < 230 && y < 680)
{
if(card7)
{
card7 = false;
}
else
{
card7 = true;
}
}
if( x >= 250 && y >= 580 && x < 330 && y < 680)
{
if(card8)
{
card8 = false;
}
else
{
card8 = true;
}
}
if( x >= 350 && y >= 580 && x < 430 && y < 680)
{
if(card9)
{
card9 = false;
}
else
{
card9 = true;
}
}
repaint();
}
public void actionPerformed(ActionEvent e)
{
String action = e.getActionCommand();
if(action.equals("replace"))
{
if(card1)
{
}
card1 = false;
card2 = false;
card3 = false;
card4 = false;
card5 = false;
card6 = false;
card7 = false;
card8 = false;
card9 = false;
}
}
}`
我没有完成对我的按钮的编码,但我希望能够先定位它。
答案 0 :(得分:0)
您需要将自定义绘画的逻辑与其他所有内容的逻辑分开。
paint
等顶级容器JFrame
。除了它们不是双缓冲的事实之外,你最终会在框架装饰下和儿童组件的顶部进行绘画。更新不透明子组件时,将不会通知父容器,这意味着您依赖框架执行的任何绘制都不会更新。相反,创建一个自定义组件,从JPanel
扩展并覆盖它的paintComponent
方法并将自定义绘画放在此处。创建JFrame
的实例,并将自定义面板的实例添加到其中。创建类似JPanel
的实例,将其布局设置为FlowLayout
,并将JButton
添加到其中。将此(按钮)面板放置到框架的SOUTH
位置,例如......
frame.add(panel, BorderLayout.SOUTH);
JFrame
默认使用BorderLayout
。