简体   繁体   English

JButton 没有放置在正确的位置或正在消失

[英]JButtons are not being placed in the correct spot or are disappearing

I am a beginner programmer and I was trying to make a simple calculator, but for some reason, the buttons don't seem to work properly and they either disappear, fill up the whole panel, or are set in the wrong positions.我是一名初级程序员,我正在尝试制作一个简单的计算器,但由于某种原因,这些按钮似乎无法正常工作,它们要么消失,要么填满整个面板,要么设置在错误的位置。 The weird thing is that the buttons appear when I hover and click my mouse over them.奇怪的是,当我在 hover 上单击鼠标时,按钮会出现。 I might be missing something very obvious but please help (Also the code isn't very clean).我可能遗漏了一些非常明显的东西,但请帮忙(而且代码不是很干净)。 Thank you!谢谢!

Main主要的

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

CalculatorButton计算器按钮

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

Window Window

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

}

Don't use static variables.不要使用 static 变量。 Don't use static methods.不要使用 static 方法。 This is not the proper design.这不是正确的设计。

Your class can then:然后您的 class 可以:

  1. create the instance variables that are needed.创建所需的实例变量。
  2. create and add all the buttons to the panel.创建并将所有按钮添加到面板。

There is no need to create a separate method for each button.无需为每个按钮创建单独的方法。 Use a loop to create and then add each button to the panel.使用循环创建每个按钮,然后将每个按钮添加到面板。 The panel should use a layout manager so you don't need to worry about the size/location of the button.面板应使用布局管理器,因此您无需担心按钮的大小/位置。 The GridLayout would be the easies to use. GridLayout 将是易于使用的。 It will add the buttons in a row/column grid.它将在行/列网格中添加按钮。

See: How to add a shortcut key for a jbutton in java?请参阅: 如何在 java 中为 jbutton 添加快捷键? for a working example that uses this approach.对于使用这种方法的工作示例。 It will show a better design for your class that incorporates all the above suggestions.它将为您的 class 展示一个更好的设计,其中包含上述所有建议。

The weird thing is that the buttons appear when I hover and click my mouse over them.奇怪的是,当我在 hover 上单击鼠标时,按钮会出现。

Components should be added to the frame BEFORE the frame is made visible.在框架可见之前,应将组件添加到框架中。

Your JPanel is constructed using the default constructor, which means it has a FlowLayout as the LayoutManager .您的JPanel是使用默认构造函数构造的,这意味着它有一个FlowLayout作为LayoutManager That means that setting the bounds of each button manually will have strange effects.这意味着手动设置每个按钮的边界会产生奇怪的效果。 Try using an appropriate LayoutManager of your liking.尝试使用您喜欢的适当LayoutManager Or create a custom LayoutManager (by implementing that interface) which will not change the location of the components on revalidation.或者创建一个自定义LayoutManager (通过实现该接口),它不会在重新验证时更改组件的位置。

There is a corresponding tutorial on LayoutManager s: LayoutManager上有对应的教程:
https://docs.oracle.com/javase/tutorial/uiswing/layout/index.html https://docs.oracle.com/javase/tutorial/uiswing/layout/index.html

Note : JPanel is-a Container so that is why the tutorial applies also to JPanel s.注意JPanel是一个Container ,因此本教程也适用于JPanel You are already using a LayoutManager (named BorderLayout ) for the JFrame named frame ... You should also do that for the JPanel .您已经在为名为frameJFrame使用LayoutManager (名为BorderLayout )......您也应该为JPanel这样做。 It has a FlowLayout by default, but by setting manually the bounds of each JButton one can understand that you don't really need a FlowLayout but probably something else.默认情况下它有一个FlowLayout ,但是通过手动设置每个JButton的边界,人们可以理解您并不真正需要FlowLayout ,但可能需要其他东西。 You can give us a picture in your question on how you would like the layout to look like, so that we can give you directions on which LayoutManager to try.您可以在您的问题中给我们一张图片,说明您希望布局看起来如何,以便我们可以为您提供有关尝试使用哪个LayoutManager的指示。

Edit 1:编辑1:

Because you are trying to create a calculator, I would suggest to try out GridLayout with 3 columns (and 0 as the rows argument, which will make the grid of always creating a new row when 3 columns are already reached).因为您正在尝试创建一个计算器,所以我建议尝试使用3列的GridLayout (并将0作为rows参数,这将使网格在已经达到 3 列时始终创建新行)。

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

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