Sebastian
Sebastian

Reputation: 302

JButton absolute underneath my paint() board

I have a poker game where I designed a nice pretty GUI that displays the cards and players. I did it all extending JPanel inside paint() with a lot of g2d.drawImage's and g2d.drawString()'s, with definite x and y locations.

My problem now is that I need to have a couple interactive buttons underneath it.. but whenever I try to add a JButton, it appears top and center. I've used setLocation(x, y) and setLayout(null) and everything I've seen in other replies, but none of them seem to match my need (Or at least I don't have a very well understanding of where to put it)

This is how my code is set up: pokerserver.java

public class pokerserver extends JFrame {

    public pokerserver() {
        add(new drawing());    
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(720, 640);
        setLocationRelativeTo(null);
        setTitle("Poker HANGOUTS");
        setResizable(false);
        setVisible(true);            
    }

    public static void main(String args[]) {
        new pokerserver();    
    }

And then in drawing.class

public drawing() {      
    setFocusable(true);
    setBackground(new Color(39,91,46));
    setDoubleBuffered(true);        
    gameCards = new cards();
    gameCards.shuffle();

    for (int i = 0; i < 10; i++)
        seats[i] = -1;

    HQ = new HeadQuarters(this);
    HQ.start();

}

public void paint(Graphics g) {
    super.paint(g);       

    Graphics2D g2d = (Graphics2D)g;

    //All my UI code
    }

My last attempt was trying to add

   JButton button = new JButton("TEST");
    add(button);
   button.setLocation(10, 500);

at the end of public drawing(). I Keep seeing things on layout management, but it's not helping me -- mainly because I'm not sure how to implement it

Here's a screenshot to help visualize what I'm talking about->

https://i.sstatic.net/O11C0.png

Trying to get the button underneath. Unless there's a way to add an ActionListener to a drawImage()?

Upvotes: 2

Views: 427

Answers (2)

Andrew Thompson
Andrew Thompson

Reputation: 168845

I'm not really sure what you are after, but here are two interpretations.

Buttons over custom painting Buttons below custom painting

I suspect you want the 1st one 'Buttons over custom painting', but as a user I'd prefer the 2nd, with 'Buttons below custom painting'.

import java.awt.image.*;
import java.awt.*;
import javax.swing.*;

class PaintPanel extends JPanel {

    BufferedImage bg;

    PaintPanel(LayoutManager2 layout) {
        super(layout);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (bg==null) {
            bg = new BufferedImage(500,500,BufferedImage.TYPE_INT_RGB);
            Graphics2D g2 = bg.createGraphics();
            GradientPaint gp = new GradientPaint(
                0,0,Color.RED,500,500,Color.BLUE);
            g2.setPaint(gp);
            g2.fillRect(0,0,500,500);
            g2.dispose();
        }

        g.drawImage(bg,0,0,getWidth(),getHeight(),this);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel buttons = new JPanel(
                    new FlowLayout(FlowLayout.CENTER));
                buttons.setOpaque(false);
                buttons.add(new JButton("Start"));
                buttons.add(new JButton("Stop"));

                PaintPanel pp = new PaintPanel(new BorderLayout());
                pp.setPreferredSize(new Dimension(200,100));

                pp.add(buttons, BorderLayout.SOUTH);

                JOptionPane.showMessageDialog(null,pp);

                JPanel gui = new JPanel(new BorderLayout());
                gui.setBackground(Color.ORANGE);
                gui.add(pp, BorderLayout.CENTER);
                gui.add(buttons, BorderLayout.SOUTH);

                JOptionPane.showMessageDialog(null,gui);
            }
        });
    }
}

Upvotes: 2

camickr
camickr

Reputation: 324157

For your main panel use a BorderLayout.

Then to the "CENTER" you can add your game panel with all your custom painting.

Then create a panel and add the buttons to it. Now you can add this panel to the NORTH of the main panel.

In other words you are not restricted to using a single panel.

Also, custom painting should be done in the paintComponent() method of your panel, NOT the paint() method.

Upvotes: 3

Related Questions