简体   繁体   English

如何在Java Swing中摆脱JPanel中的额外填充

[英]How can I get rid of the extra padding in a JPanel in java swing

I'm working on a calculator that's based off of windows 10 calculator. 我正在使用基于Windows 10计算器的计算器。 I like the look and feel of it and I'm challenging myself to this project to test how well I know Java. 我喜欢它的外观和感觉,并且向这个项目挑战自己,以测试我对Java的了解程度。 But after I got the main design finished I noticed extra padding around my window. 但是在完成主要设计之后,我注意到窗户周围有多余的填充物。 After debugging and figuring it out, I found out that the extra padding comes my my three JPanels (topPanel, middlePanel, bottomPanel) inside of my main JPanel (mainPanel). 调试并弄清楚之后,我发现额外的填充来自我的主JPanel(mainPanel)内部的三个JPanel(topPanel,middlePanel,bottomPanel)。 I'm using a gridBagLayout and have all insets set to 0 for top, bottom, left, and right. 我正在使用gridBagLayout,并且将上,下,左和右的所有插图都设置为0。 And I'm not sure how to get rid of the extra padding. 而且我不确定如何摆脱多余的填充。 This is my full code from my Calculator class 这是我计算器类中的完整代码

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

I tried looking for JPanel.setMargin or JPanel.setInsets and couldn't find anything. 我尝试寻找JPanel.setMargin或JPanel.setInsets,却找不到任何东西。 Not sure on where to look next. 不确定接下来要去哪里。

Red border is around my JTextfield, inside of topPanel. 红色边框在topPanel内部的JTextfield周围。 Green border is around topPanel. 绿色边框在topPanel周围。 Blue border is around mainPanel. 蓝色边框位于mainPanel周围。 I want to get rid of the space between the green and blue borders. 我想摆脱绿色和蓝色边框之间的空间。 I originally had the borders set to an empty border, I'm just using this for testing my program. 我最初将边框设置为空边框,我只是用它来测试程序。

Edit: I just tried topPanel.setLocation(0, 0); 编辑:我刚刚尝试了topPanel.setLocation(0, 0); but it didn't do anything. 但是它什么也没做。

Edit2: I just changed the mainPanel to be a BorderLayout instead of GridBagLayout, and aligned the topPanel to PAGE_START, middlePanel to CENTER and bottomPanel to PAGE_END, which got rid of the space between green and blue border. Edit2:我只是将mainPanel更改为BorderLayout而不是GridBagLayout,然后将topPanel对齐到PAGE_START,将middlePanel对齐到CENTER,将bottomPanel对齐到PAGE_END,这消除了绿色和蓝色边框之间的空间。 But now I have a gap between the red and green. 但是现在我在红色和绿色之间有一个空白。

It may not seem like it, but resizability can affect a Window's preferred size, due to a change in window decorations. 看起来好像不一样,但是由于窗口装饰的更改,可缩放性会影响Window的首选大小。 Call frame.setResizable before calling frame.pack() . 呼叫frame.setResizable致电 frame.pack()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM