core16
core16

Reputation: 113

Absolute Positioning a JButton

I am trying to position a JButton with a null layout but it will not show up, if i switch to gridlayout they are only lined up in the middle no matter what i change. How can i set the position and size of my button?

In Frame

package Run;

import javax.swing.*;

import ThreeD.Display;
import ThreeD.Launcher;
import TowerDefence.Window;


import java.awt.*;
import java.awt.image.BufferedImage;

public class Frame extends JFrame{

    public static String title = "Game";        

    /*public static int GetScreenWorkingWidth() {
        return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width;
    }*/

    /*public static int GetScreenWorkingHeight() {
        return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height;
    }*/

    //public static Dimension size = new Dimension(GetScreenWorkingWidth(), GetScreenWorkingHeight());
    public static Dimension size = new Dimension(1280, 774);


    public static void main(String args[]) {
        Frame frame = new Frame();

        System.out.println("Width of the Frame Size is "+size.width+" pixels");
        System.out.println("Height of the Frame Size is "+size.height+" pixels");
    }

    public Frame() {
        setTitle(title);
        setSize(size);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ThreeDLauncher();
    }

    public void ThreeDLauncher() {
        //setLayout(new GridLayout(1, 1, 0, 0));
        setLayout(null);

        Launcher launcher = new Launcher();
        add(launcher);

        setVisible(true);       
    }

    public void TowerDefence() {
        setLayout(new GridLayout(1, 1, 0, 0));

        Window window = new Window(this);
        add(window);

        setVisible(true);
    }

    public void ThreeD() {
        BufferedImage cursor = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
        Cursor blank = Toolkit.getDefaultToolkit().createCustomCursor(cursor, new Point(0, 0), "blank");

        getContentPane().setCursor(blank);

        Display display = new Display();
        add(display);

        setVisible(true);

        display.start();
    }

}

In Launcher

package ThreeD;

import java.awt.Rectangle;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class Launcher extends JPanel{   
    private JButton play, options, help, mainMenu;
    private Rectangle rplay, roptions, rhelp, rmainMenu;

    public Launcher() {
        drawButtons();
    }

    private void drawButtons() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch(Exception e) {
            e.printStackTrace();
        }

        play = new JButton("Play");
        options = new JButton("Options");
        help = new JButton("Help");
        mainMenu = new JButton("Main Menu");

        rplay = new Rectangle(20, 50, 80, 40);
        roptions = new Rectangle(20, 50, 80, 40);
        rhelp = new Rectangle(20, 50, 80, 40);
        rmainMenu = new Rectangle(20, 50, 80, 40);

        play.setBounds(rplay);
        options.setBounds(roptions);
        help.setBounds(rhelp);
        mainMenu.setBounds(rmainMenu);

        add(play);
        add(options);
        add(help);
        add(mainMenu);
    }
}

Upvotes: 0

Views: 2259

Answers (2)

comp8nerd4u2
comp8nerd4u2

Reputation: 116

Child containers do not inherit their parent's LayoutManager, so in the constructor of Launcher I would recommend:

public Launcher() {
    this.setLayout(null);
    //this.setLayout(new GroupLayout(2, 2)); // I strongly recommend you try this though and get rid of the setBounds and rects
    drawButtons();
}

Edit: LayoutManagers layout their components, but not what is inside a component. That's why it isn't enough to just set the frame's layout.

Upvotes: 1

dann.dev
dann.dev

Reputation: 2494

My guess is you are not setting the size or layout before adding the JPanel Launcher. So the buttons are displaying fine, but the JPanel is not. Try putting in:

launcher.setBounds( new Rectangle( 0, 0, 200, 200 ) );

or what ever size you need.

See if that works

Upvotes: 0

Related Questions