【问题标题】:JButtons are not being placed in the correct spot or are disappearingJButton 没有放置在正确的位置或正在消失
【发布时间】:2020-11-21 14:32:13
【问题描述】:

我是一名初级程序员,我正在尝试制作一个简单的计算器,但由于某种原因,这些按钮似乎无法正常工作,它们要么消失,要么填满整个面板,要么设置在错误的位置.奇怪的是,当我将鼠标悬停并单击它们时,按钮会出现。我可能遗漏了一些非常明显的东西,但请帮忙(而且代码不是很干净)。谢谢!

主要

public abstract class Main {
    public static JFrame frame = new JFrame("Calculator");
    public static JPanel panel = new JPanel();
    
    public static CaculatorButton buttons = new CalculatorButton(); 
    
    public static void main(String[] args) {
        Window.window(frame, panel);
        buttons.b0(panel); 
    }
}

计算器按钮

public class CaculatorButton {
    
    private static JButton b0, b1, b2, b3, b4, b5, b6, b7, b8, b9; 
    private static JTextArea text;
    private static JButton plus;
    private static JButton minus;
    private static JButton equals; 
    private static String temp;
    
    public void b0(JPanel panel) {
        b0 = new JButton("0");      
        b0.setFocusable(false);
        b0.setBackground(Color.GRAY);
        b0.setPreferredSize(new Dimension(80, 80));
        panel.add(b0);      
        b0.setBounds(10, 395, 80, 80);  
        
        b1(panel); b2(panel); b3(panel); b4(panel); b5(panel); b6(panel); b7(panel); b8(panel); b9(panel); textArea(panel); plus(panel); minus(panel); 
        equals(panel); input();
    }
    
    private static void b1(JPanel panel) {
        b1 = new JButton("1");
        b1.setFocusable(false);
        b1.setBackground(Color.GRAY);
        b1.setPreferredSize(new Dimension(80, 80));
        panel.add(b1);
        b1.setBounds(10, 140, 80, 80);
    }

    private static void b2(JPanel panel) {
        b2 = new JButton("2");
        b2.setFocusable(false);
        b2.setBackground(Color.GRAY);
        b2.setPreferredSize(new Dimension(80, 80));
        panel.add(b2);
        b2.setBounds(95, 140, 80, 80);
    }
    
    private static void b3(JPanel panel) {

        b3 = new JButton("3");
        b3.setFocusable(false);
        b3.setBackground(Color.GRAY);
        b3.setPreferredSize(new Dimension(80, 80));
        panel.add(b3);
        b3.setBounds(180, 140, 80, 80);
    }
    
    private static void b4(JPanel panel) {
        b4 = new JButton("4");
        b4.setFocusable(false);
        b4.setBackground(Color.GRAY);
        b4.setPreferredSize(new Dimension(80, 80));
        panel.add(b4);
        b4.setBounds(10, 225, 80, 80);
    }

    private static void b5(JPanel panel) {
        b5 = new JButton("5");
        b5.setFocusable(false);
        b5.setBackground(Color.GRAY);
        b5.setPreferredSize(new Dimension(80, 80));
        panel.add(b5);
        b5.setBounds(95, 225, 80, 80);
    }

    private static void b6(JPanel panel) {
        b6 = new JButton("6");
        b6.setFocusable(false);
        b6.setBackground(Color.GRAY);
        b6.setPreferredSize(new Dimension(80, 80));
        panel.add(b6);
        b6.setBounds(180, 225, 80, 80);
    }

    private static void b7(JPanel panel) {
        b7 = new JButton("7");
        b7.setFocusable(false);
        b7.setBackground(Color.GRAY);
        b7.setPreferredSize(new Dimension(80, 80));
        panel.add(b7);
        b7.setBounds(10, 310, 80, 80);
    }
    
    private static void b8(JPanel panel) {
        b8 = new JButton("8");
        b8.setFocusable(false);
        b8.setBackground(Color.GRAY);
        b8.setPreferredSize(new Dimension(80, 80));
        panel.add(b8);
        b8.setBounds(95, 310, 80, 80);
    }
    
    private static void b9(JPanel panel) {
        b9 = new JButton("9");
        b9.setFocusable(false);
        b9.setBackground(Color.GRAY);
        b9.setPreferredSize(new Dimension(80, 80));
        panel.add(b9);
        b9.setBounds(180, 310, 80, 80);
    }
    
    private static void plus(JPanel panel) {
        plus = new JButton("+");
        plus.setFocusable(false);
        plus.setBackground(new Color(0, 200, 150));
        plus.setPreferredSize(new Dimension(80, 80));
        panel.add(plus); 
        plus.setBounds(95, 395, 80, 80);
    }
    
    private static void minus(JPanel panel) {
        minus = new JButton("-");
        minus.setFocusable(false);
        minus.setBackground(new Color(0, 200, 150));
        b0.setPreferredSize(new Dimension(80, 80));
        panel.add(minus); 
        minus.setBounds(180, 395, 80, 80);
    }
    
    private static void equals(JPanel panel) {
        equals = new JButton("="); 
        equals.setFocusable(false);
        equals.setBackground(new Color(200, 125, 0));
        b0.setPreferredSize(new Dimension(80, 335));
        panel.add(equals);
        equals.setBounds(265, 140, 80, 335);
    }
    
    private static void input() {

        JButton[] buttons = {b0, b1, b2, b3, b4, b5, b6, b7, b8, b9};
        
        ActionListener al = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                
                for (int i = 0; i <= 9; i++) {
                    if(e.getSource()== buttons[i]) {
                        String str = Integer.toString(i); 
                        if (temp == null) {
                            temp = str;
                        } else {
                            temp = temp + str;
                            text.setText(temp);
                        }
                    }
                }
            }   
        };
        
        b0.addActionListener(al);
        b1.addActionListener(al);
        b2.addActionListener(al);
        b3.addActionListener(al);
        b4.addActionListener(al);
        b5.addActionListener(al);
        b6.addActionListener(al);
        b7.addActionListener(al);
        b8.addActionListener(al);
        b9.addActionListener(al);
    }

    private static void textArea(JPanel panel) {
        
        text = new JTextArea("");
        panel.add(text);    
        text.setVisible(true);
        text.setFocusable(true);
        text.setForeground(new Color(51,255,255));
        text.setFont(text.getFont().deriveFont(25f));
        text.setBackground(Color.DARK_GRAY);
        text.setBounds(10, 10, 335, 120);
    }
}

窗口

public class Window extends JFrame {    
    public static void window(JFrame frame, JPanel panel) {     
        frame.setSize(370, 522);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true); 
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setLayout(new BorderLayout());
        
        frame.add(panel, BorderLayout.CENTER); 
        panel.setBackground(Color.DARK_GRAY);
    }

}

【问题讨论】:

    标签: java swing user-interface jpanel jbutton


    【解决方案1】:

    不要使用静态变量。不要使用静态方法。这不是正确的设计。

    然后你的班级可以:

    1. 创建所需的实例变量。
    2. 创建所有按钮并将其添加到面板。

    无需为每个按钮创建单独的方法。使用循环创建每个按钮,然后将每个按钮添加到面板。面板应使用布局管理器,因此您无需担心按钮的大小/位置。 GridLayout 将是易于使用的。它将在行/列网格中添加按钮。

    请参阅:How to add a shortcut key for a jbutton in java?,了解使用此方法的工作示例。它将为您的班级展示一个包含上述所有建议的更好的设计。

    奇怪的是,当我将鼠标悬停并单击它们时,按钮会出现。

    组件应在框架可见之前添加到框架中。

    【讨论】:

    • 谢谢!这帮了大忙!我从没想过使用循环来设置按钮。
    【解决方案2】:

    您的JPanel 是使用默认构造函数构造的,这意味着它有一个FlowLayout 作为LayoutManager。这意味着手动设置每个按钮的边界会产生奇怪的效果。尝试使用您喜欢的合适的LayoutManager。或者创建一个自定义LayoutManager(通过实现该接口),它不会在重新验证时更改组件的位置。

    LayoutManagers上有对应教程:
    https://docs.oracle.com/javase/tutorial/uiswing/layout/index.html

    注意JPanel is-a Container 所以本教程也适用于JPanels。您已经在为名为@9​​87654334@ 的JFrame 使用LayoutManager(名为BorderLayout)...您也应该为JPanel 这样做。默认情况下它有一个FlowLayout,但是通过手动设置每个JButton 的边界,人们可以理解你并不真的需要FlowLayout,但可能还有别的东西。您可以在您的问题中给我们一张图片,说明您希望布局看起来如何,以便我们可以指导您尝试使用哪个LayoutManager

    编辑 1:

    因为您正在尝试创建一个计算器,我建议您尝试 GridLayout3 列(和 0 作为 rows 参数,这将使网格总是在创建新行时已达到 3 列)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2014-06-17
      • 2017-07-29
      • 1970-01-01
      • 2020-09-11
      相关资源
      最近更新 更多