【问题标题】:GUI: JButton Covering almost the entire screenGUI:JButton 几乎覆盖整个屏幕
【发布时间】:2014-06-30 00:21:30
【问题描述】:

我在使用JFrame 和JButton 时遇到了问题。我试图将我的JButton 居中,但是当我这样做时,它几乎覆盖了整个屏幕。关于导致这种情况的任何想法?

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

这是我的代码:

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

再次感谢。

【问题讨论】:

    标签: java swing jframe jbutton layout-manager


    【解决方案1】:

    你知道是什么原因造成的吗?

    这是BorderLayout 的默认行为。 CENTER 位置的组件将占用父组件可用的最大空间量,当其他 (NORTH, SOUTH, EAST, WEST) 位置已被考虑

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

    查看A Visual Guide to Layout Managers 了解更多想法

    更新

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

    part2 = new JPanel();
    

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

    得到了……

    更新了更多示例

    首先将您的需求分解为单个容器,并专注于每个个体的布局要求,然后将它们全部重新构建到一个容器中。

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

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

    【讨论】:

    • 过去我遇到了一些问题,涉及使用 JPanel 使对象居中。我会被要求这样做吗?或者只是将JPanel居中?另外,我应该创建一个像主框架一样的新框架,还是第一个框架可以成为“主”框架?再次感谢。
    • 使用JPanel而不是按钮,这将被添加到JLabelCENTER位置,但是,只要它是透明的,你甚至不会知道它在那里.然后像GridBagLayout 这样的东西将允许您添加将围绕容器(面板)中心定位的组件。如果您需要在视图之间切换,您也可以考虑使用CardLayout
    • 你有没有机会知道一个很好的指南,我可以查看所有这些?谢谢。
    • @Niknea 您已经在this answer 中获得了指南。这次你真的要看吗?
    【解决方案2】:

    使用BoxLayout 或(更简单的)GridBagLayout 作为底部区域,如this answer 所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多