I'm making a simple GUI calculator. Before I insert the guts, I'm trying to get the GUI down. The problem that I'm having is that my JPanels
containing the keypad and display will not show up in the main JFrame
for the program. What am I missing?
Main:
import javax.swing.*;
import java.awt.*;
public class Main extends JFrame {
public Main() {
calc();
}
public final void calc() {
JFrame main = new JFrame("Alex's Calculator");
Display disp = new Display();
Keypad keyp = new Keypad();
JPanel c = new JPanel();
c.setLayout(new BorderLayout());
c.add(disp, BorderLayout.NORTH);
c.add(keyp, BorderLayout.SOUTH);
main.setDefaultCloseOperation(EXIT_ON_CLOSE);
main.setSize(400, 300);
c.setVisible(true);
main.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Main();
}
});
}
}
Keypad: (Yes, I know. I'm going to add a loop to create an array of buttons.)
import java.awt.*;
import javax.swing.*;
public class Keypad extends JPanel{
public Keypad() {
int num = 1;
JPanel Keypad = new JPanel();
JButton b1 = new JButton("1");
JButton b2 = new JButton("2");
JButton b3 = new JButton("3");
JButton b4 = new JButton("4");
JButton b5 = new JButton("5");
JButton b6 = new JButton("6");
JButton b7 = new JButton("7");
JButton b8 = new JButton("8");
JButton b9 = new JButton("9");
JButton bDec = new JButton(".");
JButton b0 = new JButton("0");
JButton bPlus = new JButton("+");
JButton bMinus = new JButton("-");
JButton bDiv = new JButton("/");
JButton bMult = new JButton("*");
JButton bBOR = new JButton("|");
JButton bBAND = new JButton("&");
JButton bModu = new JButton("%");
JButton bEq = new JButton("=");
JButton bC = new JButton("Clear");
Keypad.add(b1);
b1.setMnemonic('1');
Keypad.add(b2);
b2.setMnemonic('2');
Keypad.add(b3);
b3.setMnemonic('3');
Keypad.add(bPlus);
bPlus.setMnemonic('+');
Keypad.add(bBOR);
bBOR.setMnemonic('|');
Keypad.add(b4);
b4.setMnemonic('4');
Keypad.add(b5);
b5.setMnemonic('5');
Keypad.add(b6);
b6.setMnemonic('6');
Keypad.add(bMinus);
bMinus.setMnemonic('-');
Keypad.add(bBAND);
bBAND.setMnemonic('&');
Keypad.add(b7);
b7.setMnemonic('7');
Keypad.add(b8);
b8.setMnemonic('8');
Keypad.add(b9);
b9.setMnemonic('9');
Keypad.add(bMult);
bMult.setMnemonic('*');
Keypad.add(bModu);
bModu.setMnemonic('%');
Keypad.add(b0);
b0.setMnemonic('0');
Keypad.add(bDec);
bDec.setMnemonic('.');
Keypad.add(bC);
bC.setMnemonic('C');
Keypad.add(bDiv);
bDiv.setMnemonic('/');
Keypad.add(bEq);
bEq.setMnemonic('=');
Keypad.setLayout(new GridLayout(4, 5));
Keypad.setSize(400, 200);
Keypad.setVisible(true);
}
}
Display:
import javax.swing.*;
import java.awt.*;
public class Display extends JPanel{
JTextField result = new JTextField(20);
public Display() {
JPanel display = new JPanel();
display.setLayout(new BoxLayout(display, BoxLayout.Y_AXIS));
display.add(result);
display.setSize(400, 100);
result.setHorizontalAlignment(JTextField.RIGHT);
result.setEditable(false);
display.setVisible(true);
}
}
I'm fairly new to Java, and to programming as a whole.
Any help would be greatly appreciated. Thanks!
There are two problems in your code:
main.getContentPane().add(c, BorderLayout.CENTER);
to addJPanel c
to your frame. Make sure to do this as one of the first things you do tomain
.More discussion on #2 below. But first, your
Main
class itself is already a JFrame, so you really don't need to create a separate JFrame calledmain
. Instead, do this:Now back to those JPanels. In both cases, you create JPanel objects (
Keypad
anddisplay
) but those are never returned from the classes. Instead, make sure you're working with the fact that your classes extend JPanel - in other words, work onthis
instead of creating a separate object. For example, your newDisplay
should look like: