【问题标题】:How to position buttons - java如何定位按钮 - java
【发布时间】:2014-02-26 23:10:13
【问题描述】:

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

}`

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

【问题讨论】:

    标签: java button position


    【解决方案1】:

    您需要将自定义绘画的逻辑与……其他一切的逻辑分开。

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

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

    frame.add(panel, BorderLayout.SOUTH);
    

    JFrame 默认使用BorderLayout

    【讨论】:

    • 所以在我的主要我应该做更多这样的事情?'public static void main(String[]arg) { JFrame frame = new JFrame("Elevens"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);十一 e = 新十一(); e.setSize(900, 900); e.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); e.show();框架.add(e); }'
    • 您可以使用 JFrame#setDfaultCloseOperation 并将其传递给 JFrame.EXIT_ON_CLOSE,它会在窗口关闭时关闭 JVM,因此您不需要窗口侦听器,但是是的,就是这样
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多