0

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. 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

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

}
Sanjay Sharma
  • 3,687
  • 2
  • 22
  • 38
Arya
  • 13
  • 5

2 Answers2

2

Don't use static variables. Don't use static methods. This is not the proper design.

Your class can then:

  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. It will add the buttons in a row/column grid.

See: How to add a shortcut key for a jbutton in java? for a working example that uses this approach. It will show a better design for your class that incorporates all the above suggestions.

The weird thing is that the buttons appear when I hover and click my mouse over them.

Components should be added to the frame BEFORE the frame is made visible.

camickr
  • 321,443
  • 19
  • 166
  • 288
0

Your JPanel is constructed using the default constructor, which means it has a FlowLayout as the LayoutManager. That means that setting the bounds of each button manually will have strange effects. Try using an appropriate LayoutManager of your liking. Or create a custom LayoutManager (by implementing that interface) which will not change the location of the components on revalidation.

There is a corresponding tutorial on LayoutManagers:
https://docs.oracle.com/javase/tutorial/uiswing/layout/index.html

Note: JPanel is-a Container so that is why the tutorial applies also to JPanels. You are already using a LayoutManager (named BorderLayout) for the JFrame named frame... You should also do that for the 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. 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.

Edit 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).

gthanop
  • 3,035
  • 2
  • 10
  • 27