使用 GridBagLayout 调整 Java Swing 组件的大小

标签 java swing layout-manager gridbaglayout

我的 Java Swing GUI 一直有问题。首先,我创建了一个带有 GridBagLayout 的面板,并将所有标签添加到其中。但是,我还在另一个 JPanel 的右侧创建了一个面板,它添加了一个按钮和 2 个 slider ,它们应该与标签相匹配。

问题是 JLabel 比另一个面板右侧的组件小,这使得它看起来像这样....

例如。 water 选项 -- JSLIDER(jslider 看起来大了很多)

我试图通过将 ipadx 添加到更大的值来使组件更大,并且我还尝试将标签面板的网格宽度设置得更大,但似乎没有任何效果。它只是没有响应。

代码如下:

package gui;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;

public class Options extends JFrame{
        //water option (button changes text on or off)
        //make a button listener
        JSlider renderDistance;
        JSlider grassDensity;
        JButton waterToggleButton;

        JLabel rdTitle;
        JLabel gdTitle;
        JLabel wtTitle;
        JButton buttonClose;

        static final int RD_MIN_VALUE = 0;
        static final int RD_MAX_VALUE = 1000;
        static final int RD_INIT_VALUE = 500;


        static final int GD_MIN_VALUE = 0;
        static final int GD_MAX_VALUE = 1000;
        static final int GD_INIT_VALUE = 500;

        public Options() {
                this.setTitle("Settings");
                this.setSize(getMaximumSize());
                this.setLocationRelativeTo(null);
                createView();

                this.setVisible(true);

        }

        private void createView() {
                //Making panels and adding them to window*
                JPanel pOptions = new JPanel();
                this.add(pOptions);

                //These are for the labels that I added so people know which option they are using
                JPanel pOptionLabels = new JPanel(new GridBagLayout());
                pOptions.add(pOptionLabels);

                //These are for the middle columns, the objects like button and slider
                JPanel pOptionObjects = new JPanel(new GridBagLayout());
                pOptions.add(pOptionObjects);

                //Making panels and adding them to window*

                //Initializing Objects*

                GridBagConstraints gbcLabels = new GridBagConstraints();
                GridBagConstraints gbcObjects = new GridBagConstraints();

                renderDistance = new JSlider(RD_MIN_VALUE, RD_MAX_VALUE, RD_INIT_VALUE);
                grassDensity = new JSlider(GD_MIN_VALUE, GD_MAX_VALUE, GD_INIT_VALUE);
                waterToggleButton = new JButton("On");

                rdTitle = new JLabel("Render Distance");
                gdTitle = new JLabel("Grass Density");
                wtTitle = new JLabel("Water Terrain Visibility");

                //Initializing Objects*

                //Giving objects some attributes using methods*

                renderDistance.setMinorTickSpacing(100);
                renderDistance.setMajorTickSpacing(500);
                renderDistance.setPaintTicks(true);
                renderDistance.setPaintLabels(true);

                grassDensity.setMinorTickSpacing(100);
                grassDensity.setMajorTickSpacing(500);
                grassDensity.setPaintTicks(true);
                grassDensity.setPaintLabels(true);

                gbcLabels.gridx = 0;
                gbcLabels.gridy = 0;
                gbcLabels.anchor = GridBagConstraints.LINE_START;

                gbcObjects.gridx = 0;
                gbcObjects.gridy = 0;

                waterToggleButton.addActionListener(new ActionListener() {

                           public void actionPerformed(ActionEvent e) {

                                  if(waterToggleButton.getText().equals("Off")) {
                                          waterToggleButton.setText("On");
                                  }else {
                                          waterToggleButton.setText("Off");


                                  }
                                }
                          });



                //Giving objects some attributes using methods*

                //Add things to panel ex. p.add();
                pOptionLabels.add(rdTitle, gbcLabels);
                gbcLabels.gridy++;
                pOptionLabels.add(gdTitle, gbcLabels);
                gbcLabels.gridy++;
                pOptionLabels.add(wtTitle, gbcLabels);

                gbcObjects.gridx++;
                pOptionObjects.add(renderDistance, gbcObjects);
                gbcObjects.gridy++;
                pOptionObjects.add(grassDensity, gbcObjects);
                gbcObjects.gridy++;
                pOptionObjects.add(waterToggleButton, gbcObjects);





        }

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

        }




                }

最佳答案

改变你的思维方式。与其尝试将所有标签和所有“其他”组件布置在单独的容器中,不如考虑将它们全部放在同一个容器中。

这样,当它们被布局时,布局计算是在一个上下文中与所有组件相关的。

Sliders

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;

public class Options extends JFrame {
                //water option (button changes text on or off)
    //make a button listener

    JSlider renderDistance;
    JSlider grassDensity;
    JButton waterToggleButton;

    JLabel rdTitle;
    JLabel gdTitle;
    JLabel wtTitle;
    JButton buttonClose;

    static final int RD_MIN_VALUE = 0;
    static final int RD_MAX_VALUE = 1000;
    static final int RD_INIT_VALUE = 500;

    static final int GD_MIN_VALUE = 0;
    static final int GD_MAX_VALUE = 1000;
    static final int GD_INIT_VALUE = 500;

    public Options() {
        this.setTitle("Settings");

        createView();

        pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);

    }

    private void createView() {
        //Making panels and adding them to window*
        JPanel pOptions = new JPanel();
        this.add(pOptions);

        //These are for the labels that I added so people know which option they are using
        JPanel pOptionLabels = new JPanel(new GridBagLayout());
        pOptions.add(pOptionLabels);

        GridBagConstraints gbc = new GridBagConstraints();

        renderDistance = new JSlider(RD_MIN_VALUE, RD_MAX_VALUE, RD_INIT_VALUE);
        grassDensity = new JSlider(GD_MIN_VALUE, GD_MAX_VALUE, GD_INIT_VALUE);
        waterToggleButton = new JButton("On");

        rdTitle = new JLabel("Render Distance");
        gdTitle = new JLabel("Grass Density");
        wtTitle = new JLabel("Water Terrain Visibility");

                                //Initializing Objects*
                                //Giving objects some attributes using methods*
        renderDistance.setMinorTickSpacing(100);
        renderDistance.setMajorTickSpacing(500);
        renderDistance.setPaintTicks(true);
        renderDistance.setPaintLabels(true);

        grassDensity.setMinorTickSpacing(100);
        grassDensity.setMajorTickSpacing(500);
        grassDensity.setPaintTicks(true);
        grassDensity.setPaintLabels(true);

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.insets = new Insets(2, 2, 2, 2);

        waterToggleButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                if (waterToggleButton.getText().equals("Off")) {
                    waterToggleButton.setText("On");
                } else {
                    waterToggleButton.setText("Off");

                }
            }
        });

                                //Giving objects some attributes using methods*
        //Add things to panel ex. p.add();
        pOptionLabels.add(rdTitle, gbc);
        gbc.gridy++;
        pOptionLabels.add(gdTitle, gbc);
        gbc.gridy++;
        pOptionLabels.add(wtTitle, gbc);

        gbc.gridx++;
        gbc.gridy = 0;
        pOptionLabels.add(renderDistance, gbc);
        gbc.gridy++;
        pOptionLabels.add(grassDensity, gbc);
        gbc.gridy++;
        pOptionLabels.add(waterToggleButton, gbc);

    }

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

    }

}

关于使用 GridBagLayout 调整 Java Swing 组件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32000976/

相关文章:

java - 如何更改 JFrame 内的 JPanel?

java - 为 JDB 设置参数

Java/Swing如何处理不同的屏幕DPI和密度设置?

jQuery 布局管理器

java - 在设置布局之外添加元素(即 JLabels)

java - JDatePicker 和属性不起作用

java - MsgPack 在 Android 中序列化一个 JsonObject

基于正则表达式生成随机字符串的Java代码

java - 我们可以用 OpenCL 做什么?

java - 如何在不隐藏其标签的情况下禁用 JButton?