java - 图形用户界面 : JButton Covering almost the entire screen

标签 java swing jframe jbutton layout-manager

我在使用 JFrame 和 JButton 时遇到问题。我试图将我的 JButton 居中,但是当我这样做时,它几乎覆盖了整个屏幕。你知道是什么原因造成的吗?

这是一张关于它的外观的图片:

enter image description here

这是我的代码:

package character;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;

/**
 * Created by Niknea on 6/28/14.
 */
public class characterSelector{


    JFrame  cselectorButtons, clogo;

    JLabel logo, characterName, label;

    JButton male, female;


    public characterSelector(){

        this.createCharacterSelector();

    }


    public void createCharacterSelector() {

        try {
            label = new JLabel(new ImageIcon(ImageIO.read(getClass()
                    .getResource("/resources/Grass_Background.jpg"))));
            cselectorButtons = new JFrame("SupremeSoccer");
            logo = new JLabel(new ImageIcon(ImageIO.read(this.getClass().getResource("/resources/Character_Selector_Image.png"))));
            characterName = new JLabel("<Character Name>");
            characterName.setFont(new Font(characterName.getFont().getName(),
                    Font.HANGING_BASELINE, 50));

            /*
            Buttons
             */

            male = new JButton("Male");


            ////******************////
            //// END OF BUTTONS  ////
            ////****************////
            cselectorButtons.add(logo);
            cselectorButtons.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            cselectorButtons.setContentPane(label);
            cselectorButtons.setLayout(new BorderLayout());
            cselectorButtons.add(logo, BorderLayout.NORTH);
         cselectorButtons.add(male, BorderLayout.CENTER);
            cselectorButtons.pack();
            cselectorButtons.setLocationRelativeTo(null);
            cselectorButtons.setVisible(true);
        } catch (IOException exp) {
            exp.printStackTrace();
        }
    }
}

再次感谢。

最佳答案

Any idea's on what's causing this?

这是BorderLayout的默认行为。当其他组件(NORTHSOUTHEASTWEST)位置已考虑在内

根据您想要实现的目标,您可能会考虑创建另一个 JPanel (将其 opaque 状态设置为 false 因此它是透明的)并且请改用 GridLayoutGridBagLayout 之类的内容。

看看A Visual Guide to Layout Managers获取更多想法

已更新

所以根据你的linked code ,我改变了

part2 = new JPanel();

part2 = new JPanel(new java.awt.GridBagLayout());

并且得到了...

Get it on

更新了更多示例

首先将您的需求分解为单独的容器,并重点关注每个单独的布局需求,然后将它们全部构建回单个容器中。

这将使以后更改它们变得更加容易,也使控制它们变得更加容易......

Grass

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ExampleLayout {

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

    public ExampleLayout() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private HeaderPane header;
        private ScorePane score;
        private CharacterSelectionPane characterSelection;

        public TestPane() {

            setLayout(new BorderLayout());

            JLabel background = new JLabel();

            try {
                BufferedImage img = ImageIO.read(getClass().getResource("/Grass.jpg"));
                background.setIcon(new ImageIcon(img));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            add(background);

            background.setLayout(new GridBagLayout());

            header = new HeaderPane();
            score = new ScorePane();
            characterSelection = new CharacterSelectionPane();

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.BOTH;

            background.add(header, gbc);
            background.add(score, gbc);
            gbc.weighty = 1;
            background.add(characterSelection, gbc);
        }
    }

    public class HeaderPane extends JPanel {

        public HeaderPane() {
            setLayout(new BorderLayout());
            JLabel label = new JLabel("Character Selection");
            label.setForeground(Color.WHITE);
            label.setFont(label.getFont().deriveFont(Font.BOLD, 48f));
            label.setHorizontalAlignment(JLabel.CENTER);
            add(label);
            setOpaque(false);
        }

    }

    public class ScorePane extends JPanel {

        public ScorePane() {
            JLabel label = new JLabel("[-][-[]-][-]");
            label.setForeground(Color.YELLOW);
            add(label);
            setOpaque(false);
        }

    }

    public class CharacterSelectionPane extends JPanel {

        private JButton btMale;
        private JButton btFemale;
        private JTextField tfName;
        private JButton btContinue;

        public CharacterSelectionPane() {
            setOpaque(false);
            setLayout(new GridBagLayout());

            btMale = new JButton("Male");
            btFemale = new JButton("Female");
            btContinue = new JButton("Continue");
            tfName = new JTextField(10);

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(4, 4, 4, 4);
            gbc.fill = GridBagConstraints.HORIZONTAL;

            add(btMale, gbc);
            gbc.gridx++;
            add(btFemale, gbc);
            gbc.gridx = 0;
            gbc.gridy++;
            add(new JLabel("Name:"), gbc);
            gbc.gridx++;
            add(tfName, gbc);
            gbc.gridx = 0;
            gbc.gridy++;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(btContinue, gbc);
        }

    }

}

关于java - 图形用户界面 : JButton Covering almost the entire screen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24481472/

相关文章:

java - 删除表格中的水平线

java - JTextPane 在 Mac 中渲染 utf-8 文本错误

java - JFrame 标题在失去焦点之前不会改变

java - Spring MVC URL 映射

java - 使用 Mqttclient 异步并发处理多个消息传递

java - 在自定义 JPanel 上添加按钮

java - Java 中的 Swing 重用

Java( Swing ): Annoyance resizing JFrame by dragging the bottom left corner

java - 如何避免 SonarQube 有关抽象异常的问题?

java - Google Play 服务入门,无法解析符号