当前位置: 首页 > 知识库问答 >
问题:

Java,GridBagLayout。如何将组件添加到其他组件

盖夕
2023-03-14

我正在学习JSwing,我发现了GridBagLayout。

我试图创建一个简单的计算器,我添加了多个JPanel设置每个首选大小,但当我调整窗框大小时,面板也不会调整大小。然后我发现了Gridbag的布局。

但我得到的是:GridBagLayout的计算器错误

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

public class Calc extends JFrame {

private final int  WIDTH = 300;
private final int  HEIGHT = 450;

public Calc(){

    setSize(WIDTH, HEIGHT);

    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new BorderLayout());




    mainPanel.add(createButtons(), BorderLayout.SOUTH);


    add(mainPanel);


}

private  JPanel createButtons(){

    JPanel panel = new JPanel();

    GridBagLayout layout = new GridBagLayout();

    panel.setLayout(layout);


    GridBagConstraints g = new GridBagConstraints();

    g.gridx = 0;
    g.gridy = 0;

    for(int i = 0; i < 9; i++){

        panel.add(new JButton(""+i), g);
        g.gridx++;
        if(g.gridx == 3) {
            g.gridx = 0;
            g.gridy++;
        }

    }


    return panel;



}


public static void main(String... args){

    Calc calc = new Calc();
    calc.setVisible(true);

}

}

应该是这样的:正确的计算器

我试过:

  • 要锚定。。。但它不起作用,
  • 创建多个JPanel(一个带有GridLayout),但不起作用

如果你不想用勺子舀代码,没关系。。但是我应该从哪里开始呢?

编辑:我知道如何排列按钮。。。但我无法设置标题以填充所有x轴:代码:

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

public class ButtonPanel extends JPanel {

JPanel top;
JPanel left;
JPanel right;


private class CButton extends JButton{

    private Operation operation;

    public CButton(){

    }



}

public ButtonPanel(){

    initComponent();
    initLayout();
}

private void initLayout() {

    GridBagLayout layout = new GridBagLayout();
    this.setLayout(layout);

    layout.columnWeights = new double[] {3,1};
    layout.rowWeights = new double[] {1, 1};

    GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    c.fill = GridBagConstraints.BOTH;

    c.weightx = 5;
    this.add(top, c);
    c.gridy++;
    c.weighty=1;
    this.add(left, c);
    c.gridx++;
    this.add(right, c);




}

private void initComponent() {

    top = new JPanel();

    top.setLayout(new GridLayout(1, 3));

    for(int i = 0; i < 3; i++){
        top.add(new JButton("bbb"));
    }



    left = new JPanel();

    left.setLayout(new GridLayout(3,3));
    for(int i = 0; i < 9; i++){

        left.add(new JButton(""+i));

    }

    right = new JPanel();
    right.setLayout(new GridLayout(3,1));
    for(int i = 0; i < 3; i++){
        JButton btn = new JButton("aa");
        right.add(btn);

    }

}

public static void main(String[] args) {
    JFrame frame = new JFrame("test");
    frame.setLayout(new BorderLayout());
    frame.add(new ButtonPanel(), BorderLayout.SOUTH);
    frame.setSize(300, 450);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

}

应该是:形象

共有1个答案

颜经艺
2023-03-14

您可能可以在一个面板中完成所有操作,使用一些跨越多列的按钮。

所以我给你一个不同的例子,用一个GridBagLayout来布局按钮,在这里你可以定义你的按钮排列为一个值数组,检查它是否是你项目的一个良好起点。

package test;

import static test.Calculator.Buttons.*;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;

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

public class Calculator extends JPanel {
    //Here define all possible buttons with labels
    public enum Buttons {
        PERCENT("%"), CE("CE"), CLEAR("C"),
        ONE("1"), TWO("2"), THREE("3"), FOUR("4"), FIVE("5"), SIX("6"), SEVEN("7"), EIGHT("8"), NINE("9"), ZERO("0"),
        ADD("+"), SUB("-"), MULT("x"), DIV("/"), RESULT("="), DECPOINT(".");
        
        protected String text;
        
        Buttons(String txt) {
            this.text=txt;
        }
        
        public String getText() {
            return text;
        }
    };
    
    //This array contains your keypad layout, contiguous repeated elements will span across multiple columns (e.g. ZERO). 
    protected Buttons[][] keyPad = {
        {PERCENT, CE, CLEAR, DIV},
        {SEVEN, EIGHT, NINE, MULT},
        {FOUR, FIVE, SIX, ADD},
        {ONE, TWO, THREE, SUB},
        {ZERO, ZERO, DECPOINT, RESULT}
    };
    
    Map<JButton, Buttons> sourceMap=new HashMap<>();
    
    ActionListener padListener=new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            onKeyPadPressed(sourceMap.get(e.getSource()));
        }
    };
    
    public Calculator() {
        setLayout(new GridBagLayout());
        GridBagConstraints c=new GridBagConstraints();
        c.weightx=1.0;
        c.weighty=1.0;
        c.fill=GridBagConstraints.BOTH;
        
        for (int y=0;y<keyPad.length;y++) {
            for (int x=0;x<keyPad[y].length;) {
                Buttons b=keyPad[y][x];
                if (b==null) {
                    continue;
                }
                JButton btn=new JButton(b.getText());
                c.gridx=x;
                c.gridy=y;

                c.gridwidth=0;
                while(x<keyPad[y].length&&keyPad[y][x]==b) {
                    c.gridwidth++;
                    x++;
                }
                add(btn,c);
                
                sourceMap.put(btn,b);
                btn.addActionListener(padListener);
            }
        }
        
    }
    
    //Callback method, whenever a button is clicked you get the associated enum value here
    protected void onKeyPadPressed(Buttons b) {
        System.out.println("Pressed "+b);
        switch (b) {
//          case ZERO:
//          .... here your logic
        }
    }
    
    public static void main(String[] args) {
        JFrame frame=new JFrame("Calculator");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new Calculator());
        frame.pack();
        frame.setVisible(true);
    }
}

上面的代码产生了这个结果,但是添加/删除按钮和更改布局非常容易。

 类似资料:
  • 问题内容: 如何控制转盘中包含哪些文件?似乎没有被使用。 更新 : 我错了从源tarball安装与安装轮子之间的区别。源代码发行版包含中指定的文件,但已安装的软件包仅包含python文件。无论是通过源分发版,egg还是wheel安装,都需要采取步骤来确定应安装的其他文件。即,其他软件包文件需要package_data,而软件包外部文件(例如命令行脚本或系统配置文件)需要data_files。 原始

  • 问题内容: 我想将背景图像添加到我的JFrame中,但是当我使用下面的代码进行操作时,我无法添加其他元素,例如JLabel或JTextField。 您能否告诉我是否还有另一种方法可以将JTabbedPane添加到具有背景的JFrame中? 谢谢。 问题答案: 像这样? 附录:“通常您会先调用,但是由于图像将覆盖整个背景,因此无需这样做。” — [camickr] 如果仅创建自定义UI来添加背景图像

  • 问题内容: 我有一个 JFrame 。 我也有一个 Box 类,它扩展了 Component 。该box类具有一个 paint 方法,该方法可以创建一个填充的矩形。 当我将这些Box组件的多个添加到我的JFrame时,当我在JFrame上调用 重绘 时,仅显示最近添加的一个。 我看了一下布局管理器,但是我不确定那不是我想要的。我所希望的是能够在屏幕上的任何位置制作整个矩形的动画。 (我还尝试创建一

  • 我正在学习java,我正在尝试从另一个类向我的框架中添加一个菜单栏(练习将代码分成多个类以更好地组织程序)。 以下是我的代码示例: 和menubar类: 我使用eclipse,在这行中: “add”带下划线,因此我无法编译代码。 我一直在寻找解决这个问题的方法,据我所知,这应该是可行的。 感谢您的帮助。 非常感谢。 乔什

  • 我试图向数组中添加一个元组(例如,2项元组)。 我得到的是: 找不到接受提供的参数的“=”的重载 提示:我试图超载每个参考书的=: ...但是没有弄对。 有什么想法吗。。。解决方案

  • 问题内容: 我在3个单独的类中有3个窗口,我想使用cardLayout,以便当你单击next按钮时,将出现下一个窗口。如何将包含不同元素的JPanels添加到一个cardLayout?这是第一个窗口:(尽管唯一的区别是背景-但它代表了我实际得到它的想法) 第二个窗口: 最后一个: 问题答案: 我做了一个小程序,希望程序中写的注释可以指导你了解如何使用CardLayout。