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

为什么我不能添加按钮到我的GridLayout JPanel?

裴鸿熙
2023-03-14

我试图将24个JButtons添加到我的JPanelbuttonPanelGridLayout,但当我运行它时,我发现没有添加任何按钮。(至少,它们不可见!)。我试着给按钮面板一个背景色,它是可见的。有人知道我做错了什么吗?

这是我的代码(还有一个类):

package com.Egg;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;



public class NormalCalc implements ActionListener {
    static JPanel normalCalcPanel = new JPanel();
    JPanel buttonPanel = new JPanel(new GridLayout(6,4,10,10));
    Font font = new Font("Monospaced Bold", Font.BOLD, 18);
    
    JButton powB = new JButton("^");
    JButton sqrtB = new JButton("sqrt(");
    JButton hOpenB = new JButton("(");
    JButton hCloseB = new JButton(")");
    JButton delB = new JButton("DEL");
    JButton acB = new JButton("AC");
    JButton mulB = new JButton("*");
    JButton divB = new JButton("/");
    JButton addB = new JButton("+"); 
    JButton minB = new JButton("-");
    JButton decB = new JButton(".");
    JButton equB = new JButton("=");
    JButton negB = new JButton("(-)");
    
    JButton[] numberButtons = new JButton[10];
    JButton[] functionButtons = new JButton[13];

    
    
    public NormalCalc() {
        functionButtons[0] = powB;
        functionButtons[1] = delB;
        functionButtons[2] = acB;
        functionButtons[3] = sqrtB;
        functionButtons[4] = mulB;
        functionButtons[5] = divB;
        functionButtons[6] = hOpenB;
        functionButtons[7] = addB;
        functionButtons[8] = minB;
        functionButtons[9] = hCloseB;
        functionButtons[10] = decB;
        functionButtons[11] = negB;
        functionButtons[12] = equB;
        
        
        for (int i=0; i<10; i++) {
            numberButtons[i] = new JButton(String.valueOf(i));
            numberButtons[i].setFocusable(false);
            numberButtons[i].setFont(font);
            numberButtons[i].addActionListener(this);
        }
        for (int i=0; i <13; i++) {
            functionButtons[i].setFocusable(false);
            functionButtons[i].setFont(font);
            functionButtons[i].addActionListener(this);
        }
        normalCalcPanel.setBounds(0, 0, 500, 700);
        
        buttonPanel.setBounds(50, 200, 400, 400);
        

        // Adding the buttons;
        buttonPanel.add(functionButtons[0]);
        buttonPanel.add(numberButtons[7]);
        buttonPanel.add(numberButtons[8]);
        buttonPanel.add(numberButtons[9]);
        buttonPanel.add(functionButtons[1]);
        buttonPanel.add(functionButtons[2]);
        buttonPanel.add(functionButtons[3]);
        buttonPanel.add(numberButtons[4]);
        buttonPanel.add(numberButtons[5]);
        buttonPanel.add(numberButtons[6]);
        buttonPanel.add(functionButtons[4]);
        buttonPanel.add(functionButtons[5]);
        buttonPanel.add(functionButtons[6]);
        buttonPanel.add(numberButtons[1]);
        buttonPanel.add(numberButtons[2]);
        buttonPanel.add(numberButtons[3]);
        buttonPanel.add(functionButtons[7]);
        buttonPanel.add(functionButtons[8]);
        buttonPanel.add(functionButtons[9]);
        buttonPanel.add(numberButtons[0]);
        buttonPanel.add(functionButtons[10]);
        buttonPanel.add(functionButtons[11]);
        buttonPanel.add(functionButtons[12]);
        
        buttonPanel.repaint();
        
        normalCalcPanel.add(buttonPanel);
        normalCalcPanel.add(MainMath.exitButton);
        
        MainMath.frame.add(normalCalcPanel);
        MainMath.frame.repaint();
    }



    @Override
    public void actionPerformed(ActionEvent e) {
        
        
    }
}

其他(主要)类别:

package com.Egg;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class MainMath implements ActionListener {

    static JFrame frame = new JFrame("Math Tools");
    static JButton exitButton = new JButton("Exit");

    JPanel mainPanel = new JPanel();
    JLabel mainLabel = new JLabel("Select your tool.", SwingConstants.CENTER);


    JButton nB = new JButton("Normal Calc.");
    JButton tB = new JButton("Right Triangle Calc.");
    JButton eB = new JButton("Equations Calc.");



public MainMath() { 
    frame.setBounds(300, 300, 500, 700);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(null);
    frame.setResizable(false);
    
    mainPanel.setLayout(null);
    mainPanel.setBounds(0, 0, 500, 700);
    
    mainLabel.setBounds(100, 25, 300, 50);
    mainLabel.setFont(new Font("Monospaced Bold", Font.BOLD, 18));
    
    nB.setBounds(100, 100, 300, 40);
    tB.setBounds(100, 150, 300, 40);
    eB.setBounds(100, 200, 300, 40);
    nB.setFocusable(false);
    tB.setFocusable(false);
    eB.setFocusable(false);
    nB.addActionListener(this);
    tB.addActionListener(this);
    eB.addActionListener(this);
    
    mainPanel.add(mainLabel);
    mainPanel.add(nB);
    mainPanel.add(tB);
    mainPanel.add(eB);
    frame.add(mainPanel);
    frame.setVisible(true);
    
    exitButton.setBounds(16, 10, 80, 35);
    exitButton.setFocusable(false);
    exitButton.addActionListener(this);
    
}
public static void main(String[] args) {
    new MainMath();
    
    System.out.println("");
    
}

public void setMainScreen() {
    frame.remove(exitButton);
    
    frame.remove(NormalCalc.normalCalcPanel);
    frame.add(mainPanel);
    frame.repaint();
}

public static JFrame getFrame() {
    return frame;
}





@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == exitButton) 
        setMainScreen();
    
    if (e.getSource() == nB) {
        frame.remove(mainPanel);
        new NormalCalc();
    }
    if (e.getSource() == tB)
        new TriangleCalc();
    if (e.getSource() == eB)
        new EquationCalc();
}

}

共有1个答案

常波
2023-03-14

我在您的代码中看到了多个问题:

>

  • 乍一看,你的按钮排列很奇怪。

    normalCalcPanel是静态的,为什么?不应该这样

    setBounds(…) 使用布局管理器时,这些语句会被忽略,因此不需要它们

    repaint()除非您在显示GUI后添加/删除了任何元素,否则这些调用都是不必要的,而且还应该附带revalidate()

    Main Math.exitButton另一个静态组件,STOP

    MainMath。框架add(normalCalcPanel)意味着被称为frameJFrame也是静态的,这同样不应该是静态的

    (我在这里猜)很可能你正在MainMath中创建第二个实例,但是因为我们没有该类的代码,所以我们不知道发生了什么

    我运行了你的代码,看起来还可以,所以我相信你的MainMath正在创建另一个JFrame

    这里有一个计算器配置的例子,它应该可以帮助您类似地构建代码,不是图形用户界面,而是组件和类

    好吧,我现在明白了,我不应该使用静态的东西,但是我怎么能把一个面板添加到我在另一个类中创建的框架中呢?我用了静态,因为它看起来很有效

    让我们对这个案例做一个类比,假设你的JFrame是一本书,而你的JPanel是那本书的工作表,当你在这些工作表上写作时,你不会将这本书添加/粘贴到工作表中,你把床单加到书上。

    所以,在这种情况下是一样的,你的主类应该创建JPanels并将它们添加到你的JFrame中,你的JPanels类不应该知道你的JFrame

    就这本书而言,你的书页不需要知道这本书属于哪本书,你知道这一点,而这本书知道哪些书页属于它,而不是viceversa。

    我举了一个例子来告诉你我的意思,我没有重新创建你的GUI,而是尽可能简单地让你明白:

    import java.awt.GridLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class AnotherCalculator {
        private JFrame frame;
        private CalculatorPanel calculatorPanel;
        
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new AnotherCalculator()::createAndShowGUI);
        }
        
        private void createAndShowGUI() {
            frame = new JFrame(getClass().getSimpleName());
            calculatorPanel = new CalculatorPanel();
            
            frame.add(calculatorPanel);
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }
    
    class CalculatorPanel extends JPanel {
        private String[] operations = {"+", "-", "*", "/", "DEL", "AC", "(", ")", "-", "^", "SQRT", ".", "+/-", "="};
        private static final int NUMBER_OF_DIGITS = 10;
        
        private JButton[] buttons;
        
        public CalculatorPanel() {
            this.setLayout(new GridLayout(0, 4, 5, 5));
            
            buttons = new JButton[operations.length + NUMBER_OF_DIGITS];
            for (int i = 0; i < buttons.length; i++) {
                if (i < NUMBER_OF_DIGITS) {
                    buttons[i] = new JButton(String.valueOf(i));
                } else {
                    buttons[i] = new JButton(operations[i - NUMBER_OF_DIGITS]);
                }
                this.add(buttons[i]);
            }
        }
    }
    

  •  类似资料:
    • 嗨,我的问题是我不能添加按钮到动作听者,我会做一个菜单,我不知道为什么我成为一个错误在这里代码包lvl; }哦,我变成了一个错误,错误说不能在静态上下文中使用它,它是由credits.addActionListener(this)创建的;请帮助我

    • 问题内容: 我对git和詹金斯都很陌生。 我将密钥添加到bitbucket和本地计算机中时: 我可以克隆。 但是,当我将相同的url()添加到Jenkins存储库url时,出现以下错误: 问题答案: 您还需要为Jenkins用户设置ssh密钥。 通常的想法是,您登录到Jenkins框,并成为“ jenkins”用户。您可以为您的Jenkins用户打电话,所以请确保使用正确的名称。一旦成为Jenki

    • 问题内容: 我正在使用jQuery SVG。我无法向对象添加或删除类。有人知道我的错误吗? SVG: 不会添加该类的jQuery: 我知道SVG和jQuery可以很好地协作,因为我 可以 定位对象并在单击对象时发出警报: 问题答案: 阅读以下两个答案。 jQuery 3修复了潜在的问题 Vanilla JS:可在现代浏览器中使用 jQuery(小于3)无法将类添加到SVG。 与SVG一起使用,因此

    • 这是GitHub上的python项目,我正在为Magic 8 Ball模拟制作GUI。我似乎无法使用.pack()函数,或者我的窗口只是永远加载而没有实例化。 创建时 当我点击按钮时,文本会出现

    • 一个解决方案是(如果我读对了的话)添加一个任意的JPanel,在这个例子中是一个标签。我的问题是在消息窗口中需要一个JComboBox对象,并且(与解决coffee_table的问题相同)使用JComboBox似乎删除了取消按钮。如果我将YES_NO_CANCEL_OPTION替换为OK_CANCEL_OPTION或question_message并不重要。 对于JOptionPane家族,我仍然

    • 问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严