如何定位按钮 - java

时间:2014-02-26 23:10:13

标签: java button position

我正在尝试用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;
    }
}

}`

我没有完成对我的按钮的编码,但我希望能够先定位它。

1 个答案:

答案 0 :(得分:0)

您需要将自定义绘画的逻辑与其他所有内容的逻辑分开。

  • 不要覆盖paint等顶级容器JFrame。除了它们不是双缓冲的事实之外,你最终会在框架装饰下和儿童组件的顶部进行绘画。更新不透明子组件时,将不会通知父容器,这意味着您依赖框架执行的任何绘制都不会更新。相反,创建一个自定义组件,从JPanel扩展并覆盖它的paintComponent方法并将自定义绘画放在此处。
  • 将游戏逻辑与视图分开。使用某种模型,您可以与之交互,并可以向游戏的各种视图提供通知。这改善了通信渠道并使代码分离。

创建JFrame的实例,并将自定义面板的实例添加到其中。创建类似JPanel的实例,将其布局设置为FlowLayout,并将JButton添加到其中。将此(按钮)面板放置到框架的SOUTH位置,例如......

frame.add(panel, BorderLayout.SOUTH);

JFrame默认使用BorderLayout