Java 如何在JFrame中排列多个面板

Java 如何在JFrame中排列多个面板,java,swing,jpanel,layout-manager,calculator,Java,Swing,Jpanel,Layout Manager,Calculator,我正在尝试制作一个简单的计算器来练习图形(我是一个完全的GUI noob)。在Polyashenkos Calulator和文本区域以及文本区域和按钮之间的空间之后,我遇到了一些不必要的空间问题。此外,我如何保持布局,但消除空间,也使底部的3个按钮更小。任何关于我在做什么或如何做得更好的建议都将不胜感激。多谢各位 import javax.swing.*; import java.awt.*; public class calculator { public static void

我正在尝试制作一个简单的计算器来练习图形(我是一个完全的GUI noob)。在Polyashenkos Calulator和文本区域以及文本区域和按钮之间的空间之后,我遇到了一些不必要的空间问题。此外,我如何保持布局,但消除空间,也使底部的3个按钮更小。任何关于我在做什么或如何做得更好的建议都将不胜感激。多谢各位

import javax.swing.*;
import java.awt.*;

public class calculator {

    public static void main(String[] args) {
        // creates the JFrame(a window with decorations)
        JFrame frame = new JFrame("Calculator"); 
        // stops the program when window is closed
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setSize(377, 350);

        // the main panel of the JFrame, 
        // remembet you cant add content directly to JFrame
        JPanel content = new JPanel(new GridLayout(4, 0)); 
        // panel for the text field
        JPanel textarea = new JPanel(new GridLayout(4, 0)); 
        // panel for the buttons, 
        // GridLayout(int rows, int cols, int horiz_gap, int vert_gap)
        JPanel buttonarea = new JPanel(new GridLayout(4, 5, 2, 2)); 

        //  the panel for the bigger bottom buttons
        JPanel secondbuttonarea = new JPanel(new GridLayout(1, 1, 2, 2)); 
        // the panel for the text on top
        JPanel label = new JPanel(); 
        content.add(label);
        content.add(textarea);
        content.add(buttonarea);
        content.add(secondbuttonarea);

        JLabel words = new JLabel("Polyashenko's Calculator", JLabel.CENTER);
        label.add(words);

        JTextField enterhere = new JTextField("0.", JTextField.CENTER);
        // will set the curser of the text bar on right side
        enterhere.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
        textarea.add(enterhere);

        // makes a button called b1 with text in it
        JButton b1 = new JButton("BkSP"); 
        // adds the backspace button to the buttonarea panel
        buttonarea.add(b1); 
        JButton b2 = new JButton("CE");
        buttonarea.add(b2);
        JButton b3 = new JButton("C");
        buttonarea.add(b3);
        JButton b4 = new JButton("/");
        buttonarea.add(b4);
        JButton b5 = new JButton("sqrt");
        buttonarea.add(b5);
        JButton b6 = new JButton("7");
        buttonarea.add(b6);
        JButton b7 = new JButton("8");
        buttonarea.add(b7);
        JButton b8 = new JButton("9");
        buttonarea.add(b8);
        JButton b9 = new JButton("*");
        buttonarea.add(b9);
        JButton b10 = new JButton("%");
        buttonarea.add(b10);
        JButton b11 = new JButton("4");
        buttonarea.add(b11);
        JButton b12 = new JButton("5");
        buttonarea.add(b12);
        JButton b13 = new JButton("6");
        buttonarea.add(b13);
        JButton b14 = new JButton("-");
        buttonarea.add(b14);
        JButton b15 = new JButton("1/x");
        buttonarea.add(b15);
        JButton b16 = new JButton("1");
        buttonarea.add(b16);
        JButton b17 = new JButton("2");
        buttonarea.add(b17);
        JButton b18 = new JButton("3");
        buttonarea.add(b18);
        JButton b19 = new JButton("+");
        buttonarea.add(b19);
        JButton b20 = new JButton("+/-");
        buttonarea.add(b20);

        JButton b21 = new JButton("0");
        secondbuttonarea.add(b21);
        JButton b22 = new JButton(".");
        secondbuttonarea.add(b22);
        JButton b23 = new JButton("=");
        secondbuttonarea.add(b23);

        // adds the buttonarea panel to the main panel
        frame.getContentPane().add(content); 
        // makes the window visible, put at end of program
        frame.setVisible(true); 
    }
}


在这样的情况下,
GridLayout
永远不会看起来很好

内容将展开以填充网格中的框。您只能对行和列之间的间距进行最小的控制

您可能需要更改布局以使其看起来符合您的需要
GridBagLayout
具有所有控制功能,但配置起来要困难得多

有时,您可以使用
BorderLayout
GridLayout
嵌套面板,使其看起来合理。但它是摇摆的,这意味着它是可用的,但它变得很难使它看起来光滑

我总是喜欢使用
FlowLayout
来设置OK/Cancel按钮。在我看来,它们看起来最好,你可以把它们全部推到左边、右边或中间。您的计算器按钮应该与
GridLayout
配合使用,但您不能轻易地使用高的“回车”按钮或宽的“0”按钮

例如,尝试使用垂直的
BoxLayout
,而不是4高1宽的网格。

课程之一(-:forums.sun.com:-)

导入java.awt.BorderLayout;
导入java.awt.Font;
导入java.awt.GridLayout;
导入java.awt.Window;
导入java.awt.event.*;
导入javax.swing.*;
公共类SciCalc{
私有静态void createAndShowUI(){
SciCalcGui=new SciCalcGui();
SciCalcMenu菜单=新SciCalcMenu(gui);
JFrame=新的JFrame(“计算器”);
frame.getContentPane().add(gui.getMainPanel());
frame.setJMenuBar(menu.getJMenuBar());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
invokeLater(new Runnable()){
@凌驾
公开募捐{
createAndShowUI();
}
});
}
private SciCalc(){
}
}
类SciCalcGui{
专用静态最终字符串[][]标准文本={
{"7", "8", "9", "/"}, {"4", "5", "6", "*"},
{"1", "2", "3", "-"}, {"0", ".", "=", "+"}};
私有静态最终字符串[][]科学文本={
{“sqrt”、“1/x”、“sin”}、{“%”、“Exp”、“cos”},
{“x^y”,“ln”,“tan”},{“x^2”,“n!”,“sec”};
专用静态最终内部间隙=5;
私有静态最终字体BTN_Font=新字体(Font.DIALOG,Font.BOLD,20);
private JPanel mainPanel=new JPanel();
私人JPanel SCI小组;
私有JTextField display=新JTextField();
SciCalcGui(){
display.setFont(BTN_字体);
JPanel standardPanel=createBtnPanel(标准文本,“标准”);
sciPanel=createBtnPanel(科学文本,“科学”);
setLayout(新的BorderLayout());
mainPanel.setBorder(BorderFactory.createEmptyByOrder(间隙,间隙,间隙));
主面板。添加(标准面板、边框布局。中心);
主面板。添加(sciPanel,BorderLayout.WEST);
主面板。添加(显示,边框布局。北);
sciPanel.setVisible(假);
}
public void sciPanelSetVisible(布尔可见){
sciPanel.setVisible(可见);
Window win=SwingUtilities.getWindowSenator(主面板);
win.pack();
}
公共JPanel getMainPanel(){
返回主面板;
}
私有JPanel createBtnPanel(字符串[][]文本,字符串标题){
JPanel btnPanel=新的JPanel();
int行=text.length;
int cols=文本[0]。长度;
setLayout(新的网格布局(行、列、间隙、间隙));
for(int row=0;rowimport java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.*;
import javax.swing.*;

public class SciCalc {

    private static void createAndShowUI() {
        SciCalcGui gui = new SciCalcGui();
        SciCalcMenu menu = new SciCalcMenu(gui);
        JFrame frame = new JFrame("Calculator");
        frame.getContentPane().add(gui.getMainPanel());
        frame.setJMenuBar(menu.getJMenuBar());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }

    private SciCalc() {
    }
}

class SciCalcGui {

    private static final String[][] STANDARD_BTN_TEXTS = {
        {"7", "8", "9", "/"}, {"4", "5", "6", "*"},
        {"1", "2", "3", "-"}, {"0", ".", "=", "+"}};
    private static final String[][] SCIENTIFIC_BTN_TEXTS = {
        {"sqrt", "1/x", "sin"}, {"%", "Exp", "cos"},
        {"x^y", "ln", "tan"}, {"x^2", "n!", "sec"}};
    private static final int GAP = 5;
    private static final Font BTN_FONT = new Font(Font.DIALOG, Font.BOLD, 20);
    private JPanel mainPanel = new JPanel();
    private JPanel sciPanel;
    private JTextField display = new JTextField();

    SciCalcGui() {
        display.setFont(BTN_FONT);
        JPanel standardPanel = createBtnPanel(STANDARD_BTN_TEXTS, "Standard");
        sciPanel = createBtnPanel(SCIENTIFIC_BTN_TEXTS, "Scientific");
        mainPanel.setLayout(new BorderLayout());
        mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        mainPanel.add(standardPanel, BorderLayout.CENTER);
        mainPanel.add(sciPanel, BorderLayout.WEST);
        mainPanel.add(display, BorderLayout.NORTH);
        sciPanel.setVisible(false);
    }

    public void sciPanelSetVisible(boolean visible) {
        sciPanel.setVisible(visible);
        Window win = SwingUtilities.getWindowAncestor(mainPanel);
        win.pack();
    }

    public JPanel getMainPanel() {
        return mainPanel;
    }

    private JPanel createBtnPanel(String[][] texts, String title) {
        JPanel btnPanel = new JPanel();
        int rows = texts.length;
        int cols = texts[0].length;
        btnPanel.setLayout(new GridLayout(rows, cols, GAP, GAP));
        for (int row = 0; row < texts.length; row++) {
            for (int col = 0; col < texts[row].length; col++) {
                JButton btn = new JButton(texts[row][col]);
                btn.setFont(BTN_FONT);
                btnPanel.add(btn);
            }
        }
        btnPanel.setBorder(BorderFactory.createTitledBorder(title));
        return btnPanel;
    }
}

class SciCalcMenu {

    private static final String STANDARD = "Standard";
    private static final String SCIENTIFIC = "Scientific";
    private SciCalcGui gui;
    private JMenuBar menuBar = new JMenuBar();
    private JMenuItem standardView;
    private JMenuItem scientificView;

    SciCalcMenu(SciCalcGui gui) {
        this.gui = gui;
        standardView = new JMenuItem(STANDARD, KeyEvent.VK_T);
        scientificView = new JMenuItem(SCIENTIFIC, KeyEvent.VK_S);
        ViewAction viewAction = new ViewAction();
        standardView.addActionListener(viewAction);
        scientificView.addActionListener(viewAction);
        standardView.setEnabled(false);
        JMenu viewMenu = new JMenu("View");
        viewMenu.setMnemonic(KeyEvent.VK_V);
        viewMenu.add(standardView);
        viewMenu.add(scientificView);
        menuBar.add(new JMenu("Edit"));
        menuBar.add(viewMenu);
        menuBar.add(new JMenu("Help"));
    }

    public JMenuBar getJMenuBar() {
        return menuBar;
    }

    private class ViewAction implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            String command = e.getActionCommand();
            if (command.equals(STANDARD)) {
                gui.sciPanelSetVisible(false);
                standardView.setEnabled(false);
                scientificView.setEnabled(true);
            } else if (command.equals(SCIENTIFIC)) {
                gui.sciPanelSetVisible(true);
                standardView.setEnabled(true);
                scientificView.setEnabled(false);
            }
        }
    }
}