【问题标题】:How can I get rid of the extra padding in a JPanel in java swingjava - 如何在java swing中摆脱JPanel中的额外填充
【发布时间】:2017-08-22 01:02:43
【问题描述】:

我正在开发基于 Windows 10 计算器的计算器。我喜欢它的外观和感觉,我正在向这个项目挑战自己,以测试我对 Java 的了解程度。但是在完成主要设计后,我注意到窗户周围有额外的填充物。在调试并弄清楚之后,我发现额外的填充来自我的三个 JPanel(topPanel、middlePanel、bottomPanel)在我的主 JPanel(mainPanel)中。我正在使用 gridBagLayout 并将顶部、底部、左侧和右侧的所有插图设置为 0。而且我不确定如何摆脱额外的填充。这是我的计算器类的完整代码

package javacalculator.calculator;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;

import javax.swing.border.Border;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.Caret;
import javax.swing.text.DefaultCaret;

public class Calculator {
    private final String NAME = "Calculator";

    private JFrame frame;
    private JPanel mainPanel, topPanel, middlePanel, bottomPanel;
    private JTextField storedData;
    private JTextField data;
    private Caret caret;
    private Font font;
    private Font font2;
    private Font font3;
    private Font font4;
    private Color color;
    private JButton zero, one, two, three, four, five, six, seven, eight, nine;
    private JButton plus, minus, multiply, divide, equals;
    private JButton negative, decimal;
    private JButton ce, c, backspace;
    private JButton percent, squareRoot, squared, divideFrom1;
    private JButton mc, mr, mplus, mminus, ms, mh;

    public Calculator() {
        frame = new JFrame(NAME);
        mainPanel = new JPanel();
        topPanel = new JPanel();
        middlePanel = new JPanel();
        bottomPanel = new JPanel();

        storedData = new JTextField();
        data = new JTextField();
        caret = new DefaultCaret() {
            @Override
            public void paint(Graphics g) {

            }

            @Override
            public boolean isVisible() {
                return false;
            }

            @Override
            public boolean isSelectionVisible() {
                return false;
            }
        };
        font = new Font("Sans-Serif", Font.BOLD, 30);
        font2 = new Font("Sans-Serif", Font.PLAIN, 20);
        font3 = new Font("Sans-Serif", Font.PLAIN, 15);
        font4 = new Font("Sans-Serif", Font.PLAIN, 13);
        color = new Color(238, 238, 238);

        mc = new JButton("MC");
        mr = new JButton("MR");
        mplus = new JButton("M+");
        mminus = new JButton("M-");
        ms = new JButton("MS");
        mh = new JButton("MH");

        percent = new JButton("%");
        squareRoot = new JButton("SQRT");
        squared = new JButton("x^2");
        divideFrom1 = new JButton("1/x");

        ce = new JButton("CE");
        c = new JButton("C");
        backspace = new JButton("<=");

        plus = new JButton("+");
        minus = new JButton("-");
        multiply = new JButton("X");
        divide = new JButton("/");
        equals = new JButton("=");

        decimal = new JButton(".");
        negative = new JButton("+/-");

        zero = new JButton("0");
        one = new JButton("1");
        two = new JButton("2");
        three = new JButton("3");
        four = new JButton("4");
        five = new JButton("5");
        six = new JButton("6");
        seven = new JButton("7");
        eight = new JButton("8");
        nine = new JButton("9");

        Init();
    }

    private void Init() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ConfigureComponents();

        AddComponent(topPanel, storedData, 0, 0, 4, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(topPanel, data, 0, 1, 4, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);

        AddComponent(middlePanel, mc, 0, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(middlePanel, mr, 1, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(middlePanel, mplus, 2, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(middlePanel, mminus, 3, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(middlePanel, ms, 4, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(middlePanel, mh, 5, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);

        AddComponent(bottomPanel, percent, 0, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, squareRoot, 1, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, squared, 2, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, divideFrom1, 3, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);

        AddComponent(bottomPanel, ce, 0, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, c, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, backspace, 2, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, divide, 3, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);

        AddComponent(bottomPanel, seven, 0, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, eight, 1, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, nine, 2, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, multiply, 3, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);

        AddComponent(bottomPanel, four, 0, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, five, 1, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, six, 2, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, minus, 3, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);

        AddComponent(bottomPanel, one, 0, 4, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, two, 1, 4, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, three, 2, 4, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, plus, 3, 4, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);

        AddComponent(bottomPanel, negative, 0, 5, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, zero, 1, 5, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, decimal, 2, 5, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(bottomPanel, equals, 3, 5, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);

        AddComponent(mainPanel, topPanel, 0, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(mainPanel, middlePanel, 0, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        AddComponent(mainPanel, bottomPanel, 0, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);

        frame.add(mainPanel);

        frame.pack();
        frame.setResizable(false);

        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private void AddComponent(JPanel panel, JComponent component, int x, int y, int width, int height, int position, int stretch) {
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = x;
        gbc.gridy = y;

        gbc.gridwidth = width;
        gbc.gridheight = height;

        gbc.weightx = 0;
        gbc.weighty = 0;

        gbc.anchor = position;
        gbc.fill = stretch;

        gbc.insets = new Insets(0, 0, 0, 0);

        panel.add(component, gbc);
    }

    private void ConfigureComponents() {
        mainPanel.setLayout(new GridBagLayout());
        topPanel.setLayout(new GridBagLayout());
        middlePanel.setLayout(new GridBagLayout());
        bottomPanel.setLayout(new GridBagLayout());

        Dimension dim = new Dimension(77, 54);
        Dimension dim2 = new Dimension(dim.width * 4, dim.height);
        Dimension dim3 = new Dimension(dim.width * 4, dim.height / 2);
        Dimension dim4 = new Dimension(dim.width * 4 / 6, dim.height / 2);

        Border noBorder = BorderFactory.createEmptyBorder(0, 0, 0, 0);

        mainPanel.setBorder(noBorder);
        topPanel.setBorder(noBorder);
        middlePanel.setBorder(noBorder);
        bottomPanel.setBorder(noBorder);

        //TESTING
        topPanel.setBorder(BorderFactory.createLineBorder(Color.GREEN, 1, false));
        mainPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE, 3, false));
        //END TESTING

        storedData.setPreferredSize(dim3);
        storedData.setFont(font3);
        storedData.setBackground(Color.WHITE);
        storedData.setHorizontalAlignment(JTextField.RIGHT);
        storedData.setBorder(noBorder);
        //TESTING
        storedData.setBorder(BorderFactory.createLineBorder(Color.RED, 1, false));
        //END TESTING
        storedData.setCaret(caret);
        storedData.setEditable(false);

        data.setPreferredSize(dim2);
        data.setFont(font);
        data.setBackground(Color.WHITE);
        data.setHorizontalAlignment(JTextField.RIGHT);
        data.setBorder(noBorder);
        data.setCaret(caret);
        data.setEditable(false);

        ConfigureComponent(mc, dim4, font4, Color.WHITE, Color.BLACK, noBorder, true, false, false);
        mc.setPreferredSize(new Dimension(dim4.width + 1, dim4.height));
        ConfigureComponent(mr, dim4, font4, Color.WHITE, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(mplus, dim4, font4, Color.WHITE, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(mminus, dim4, font4, Color.WHITE, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(ms, dim4, font4, Color.WHITE, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(mh, dim4, font4, Color.WHITE, Color.BLACK, noBorder, true, false, false);
        mh.setPreferredSize(new Dimension(dim4.width + 1, dim4.height));

        ConfigureComponent(percent, dim, font2, Color.WHITE, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(squareRoot, dim, font2, Color.WHITE, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(squared, dim, font2, Color.WHITE, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(divideFrom1, dim, font2, Color.WHITE, Color.BLACK, noBorder, true, false, false);

        ConfigureComponent(ce, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(c, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(backspace, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(divide, dim, font2, color, Color.BLACK, noBorder, true, false, false);

        ConfigureComponent(seven, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(eight, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(nine, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(multiply, dim, font2, color, Color.BLACK, noBorder, true, false, false);

        ConfigureComponent(four, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(five, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(six, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(minus, dim, font2, color, Color.BLACK, noBorder, true, false, false);

        ConfigureComponent(one, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(two, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(three, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(plus, dim, font2, color, Color.BLACK, noBorder, true, false, false);

        ConfigureComponent(negative, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(zero, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(decimal, dim, font2, color, Color.BLACK, noBorder, true, false, false);
        ConfigureComponent(equals, dim, font2, color, Color.BLACK, noBorder, true, false, false);

        middlePanel.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, color));

    }

    private void ConfigureComponent(JButton component, Dimension size, Font font, Color backgroundColor, Color foreGroundColor, Border border, boolean contentAreaFilled, boolean borderPainted, boolean focusPainted) {
        component.setPreferredSize(size);
        component.setFont(font);
        component.setOpaque(true);
        component.setBackground(backgroundColor);
        component.setForeground(foreGroundColor);
        component.setBorder(border);
        component.setContentAreaFilled(contentAreaFilled);
        component.setBorderPainted(borderPainted);
        component.setFocusPainted(focusPainted);
    }
}

我尝试寻找 JPanel.setMargin 或 JPanel.setInsets 并找不到任何东西。不知道下一步该去哪里。

红色边框在我的 JTextfield 周围,在 topPanel 内部。绿色边框在 topPanel 周围。蓝色边框在 mainPanel 周围。我想摆脱绿色和蓝色边界之间的空间。我最初将边框设置为空边框,我只是用它来测试我的程序。

编辑:我刚刚尝试了topPanel.setLocation(0, 0);,但它什么也没做。

Edit2:我只是将mainPanel改为BorderLayout而不是GridBagLayout,并将topPanel对齐到PAGE_START,middlePanel对齐到CENTER,bottomPanel对齐到PAGE_END,这样就去掉了绿色和蓝色之间的空间边境。但是现在我在红色和绿色之间有一个差距。

【问题讨论】:

    标签: java jpanel padding gridbaglayout


    【解决方案1】:

    它可能看起来不像,但由于窗口装饰的变化,可调整大小会影响窗口的首选大小。致电frame.setResizable之前致电frame.pack()。

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 1970-01-01
      • 2011-05-18
      • 2014-12-09
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多