java - 绝对定位 JButton

标签 java layout null jframe jbutton

我试图用空布局定位 JButton,但它不会显示,如果我切换到网格布局,无论我更改什么,它们都只会在中间排列。如何设置按钮的位置和大小?

内框

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();
    }

}

在启动器中

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);
    }
}

最佳答案

子容器不会继承其父容器的 LayoutManager,因此在 Launcher 的构造函数中我建议:

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();
}

编辑:LayoutManager 布局其组件,但不布局组件内部的内容。这就是为什么仅仅设置框架的布局是不够的。

关于java - 绝对定位 JButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10671607/

相关文章:

android - 如何将整数标签设置为 xml 布局文件中的小部件?

c - (null) 将整数12345转换为字符串 "54321"后返回给main函数打印

javascript - 如何解决 TypeError : Cannot convert undefined or null to object

javascript - JSON 根元素和编码

java - JSON 数组到 ArrayList<List<String>>

java.security.InvalidAlgorithmParameterException : the trustAnchors parameter must be non-empty on Linux, 或为什么默认信任库为空

c# - 使用MVVM动态创建的WPF布局

html - 先从上到下渲染,再从左到右渲染,清除css/html解决方案,没有服务器端没有js

ios - 在 TableView 的自定义单元格上隐式展开可选值

java - 在 Windows 上调用 .so 文件中的 native 方法的可能性