Kalkulator - KeyListener nie działa

0

Witam.
Meczę się z moim kalkulatorem już od jakiegoś czasu, aż w końcu doszedłem do tego etapu. Nie wiem co robię źle ale nie obsługuje mi klawiatury :(

public class Calculator extends JFrame implements ActionListener, KeyListener{
	
	final static int MAX_INPUT_LENGHT = 10;
	private GridBagLayout mainLayout = new GridBagLayout();;
	private JButton[] jbDigitsButtons, jbFunctionalButtons;
	private JLabel jlDisplayDigit, jlDisplayOperation, conteiner;
	private JMenu jmMainMenu;
	private JMenuItem jmiInfo;
	private JMenuBar jmBar;
	public String number1 = "";
	public String number2 = "";
	public int result = 0;
	public boolean operandChoosen = false;
	public boolean binOnly = false;
	public String choosenOperand;

	
	
	public Calculator(){
//		conteiner = new JLabel();
//		add(conteiner);
//		conteiner.setLayout(mainLayout);
		setLayout(mainLayout);
		
		this.addKeyListener(this);
		setTitle("Kalkulator");
		
		//tworzenie menuBar		
		jmMainMenu = new JMenu("Plik");
		jmMainMenu.setFont(new Font("monospaced", Font.BOLD, 26));
		jmMainMenu.setBackground(Color.LIGHT_GRAY);
		jmMainMenu.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 2, Color.BLACK));
		jmiInfo = new JMenuItem("Info");
		jmiInfo.setFont(new Font("monospaced", Font.BOLD, 26));
		jmiInfo.setBackground(Color.LIGHT_GRAY);
		//jmiInfo.setBorder(BorderFactory.createMatteBorder(2, 2, 0, 2, Color.BLACK));
		jmBar = new JMenuBar();
		jmMainMenu.add(jmiInfo);
		jmBar.add(jmMainMenu);
		jmBar.setBackground(Color.LIGHT_GRAY);
		jmBar.setBorder(BorderFactory.createMatteBorder(2, 2, 0, 2, Color.BLACK));
		addMenu(mainLayout, jmBar, 0, 0, GridBagConstraints.REMAINDER, 1, 1, 1);
		
		// tworzenie i dodawanie wyswetlacza
		jlDisplayDigit = new JLabel("0");
		jlDisplayDigit.setBorder(BorderFactory.createMatteBorder(0, 2, 2, 2, Color.BLACK));
		Border border = jlDisplayDigit.getBorder();
		Border margin = new EmptyBorder(0,10,10,10);
		jlDisplayDigit.setBorder(new CompoundBorder(border, margin));
		jlDisplayDigit.setOpaque(true);
		jlDisplayDigit.setBackground(Color.WHITE);
		jlDisplayDigit.setHorizontalAlignment(SwingConstants.RIGHT);
		jlDisplayDigit.setFont(new Font("monospaced", Font.BOLD, 26));
		addLabel(mainLayout, jlDisplayDigit, 0, 2, GridBagConstraints.REMAINDER, 1, 1, 1);
		
		jlDisplayOperation = new JLabel(" ");
		jlDisplayOperation.setBorder(BorderFactory.createMatteBorder(2, 2, 0, 2, Color.BLACK));
		border = jlDisplayOperation.getBorder();
		margin = new EmptyBorder(10,10,0,10);
		jlDisplayOperation.setBorder(new CompoundBorder(border, margin));
		jlDisplayOperation.setOpaque(true);
		jlDisplayOperation.setBackground(Color.WHITE);
		jlDisplayOperation.setHorizontalAlignment(SwingConstants.RIGHT);
		jlDisplayOperation.setFont(new Font("monospaced", Font.BOLD, 26));
		addLabel(mainLayout, jlDisplayOperation, 0, 1, GridBagConstraints.REMAINDER, 1, 1, 1);
		
		
		
		
		// tworzenie przyciskow i dodawanie przyciskow
		jbDigitsButtons = new JButton[10];
		for(int i=0;i<10;i++){
			jbDigitsButtons[i] = new JButton(String.valueOf(i));
		}
		addButton(mainLayout, jbDigitsButtons[7], 0, 4, 1, 1, 1, 1);
		addButton(mainLayout, jbDigitsButtons[8], 1, 4, 1, 1, 1, 1);
		addButton(mainLayout, jbDigitsButtons[9], 2, 4, 1, 1, 1, 1);
		addButton(mainLayout, jbDigitsButtons[4], 0, 5, 1, 1, 1, 1);
		addButton(mainLayout, jbDigitsButtons[5], 1, 5, 1, 1, 1, 1);
		addButton(mainLayout, jbDigitsButtons[6], 2, 5, 1, 1, 1, 1);
		addButton(mainLayout, jbDigitsButtons[1], 0, 6, 1, 1, 1, 1);
		addButton(mainLayout, jbDigitsButtons[2], 1, 6, 1, 1, 1, 1);
		addButton(mainLayout, jbDigitsButtons[3], 2, 6, 1, 1, 1, 1);
		addButton(mainLayout, jbDigitsButtons[0], 0, 7, 3, 1, 1, 1);
		
		jbFunctionalButtons = new JButton[10];
		jbFunctionalButtons[0] = new JButton("BACKSPACE");
		jbFunctionalButtons[1] = new JButton("C");
		jbFunctionalButtons[2] = new JButton("/");
		jbFunctionalButtons[3] = new JButton("*");
		jbFunctionalButtons[4] = new JButton("-");
		jbFunctionalButtons[5] = new JButton("+");
		jbFunctionalButtons[6] = new JButton("MOD");
		jbFunctionalButtons[7] = new JButton("BIN");
		jbFunctionalButtons[8] = new JButton("DEC");
		jbFunctionalButtons[9] = new JButton("=");

		
		
		addButton(mainLayout, jbFunctionalButtons[0], 0, 3, 3, 1, 1, 1);
		addButton(mainLayout, jbFunctionalButtons[1], 4, 3, 1, 1, 1, 1);
		addButton(mainLayout, jbFunctionalButtons[2], 4, 4, 1, 1, 1, 1);
		addButton(mainLayout, jbFunctionalButtons[3], 4, 5, 1, 1, 1, 1);
		addButton(mainLayout, jbFunctionalButtons[4], 4, 6, 1, 1, 1, 1);
		addButton(mainLayout, jbFunctionalButtons[5], 4, 7, 1, 1, 1, 1);
		addButton(mainLayout, jbFunctionalButtons[6], 5, 3, 1, 1, 1, 1);
		addButton(mainLayout, jbFunctionalButtons[7], 5, 4, 1, 1, 1, 1);
		addButton(mainLayout, jbFunctionalButtons[8], 5, 5, 1, 1, 1, 1);
		addButton(mainLayout, jbFunctionalButtons[9], 5, 6, 1, 2, 1, 1);
		
		jbFunctionalButtons[8].setEnabled(false);
		jbFunctionalButtons[8].setBackground(new Color(224, 224, 224));
		this.addKeyListener(this);
		
	}

	private void addButton(GridBagLayout layout, JButton button, int col, int row, int gridwidth, int gridheight,int weightx, int weighty){
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = col;
		gbc.gridy = row;
		gbc.gridwidth = gridwidth;
		gbc.gridheight = gridheight;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
		gbc.fill = GridBagConstraints.BOTH;
		button.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
		button.setBackground(Color.LIGHT_GRAY);
		button.setFont(new Font("monospaced", Font.BOLD, 21));
		layout.setConstraints(button, gbc);
		button.addActionListener(this);
		add(button);
	}
	
	private void addLabel(GridBagLayout layout, JLabel label, int col, int row, int gridwidth, int gridheight,int weightx, int weighty){
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = col;
		gbc.gridy = row;
		gbc.gridwidth = gridwidth;
		gbc.gridheight = gridheight;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
		gbc.fill = GridBagConstraints.BOTH;
		layout.setConstraints(label, gbc);
		add(label);
	}
	
	private void addMenu(GridBagLayout layout, JMenuBar menuBar, int col, int row, int gridwidth, int gridheight,int weightx, int weighty){
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = col;
		gbc.gridy = row;
		gbc.gridwidth = gridwidth;
		gbc.gridheight = gridheight;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
		gbc.fill = GridBagConstraints.BOTH;
		layout.setConstraints(menuBar, gbc);
		add(menuBar);
	}

	@Override
	public void actionPerformed(ActionEvent e){
		
	}

	private void addDigit(int digit){
		if(operandChoosen){
			if(number2.length()<MAX_INPUT_LENGHT){
				if(digit != 0 || number2.length() !=0){
					number2 += digit;
					jlDisplayDigit.setText(number2);
				}
				else{
					jlDisplayDigit.setText("Dzielenie przez 0");
				}
			}	
		}
		else{
			if(number1.length()<MAX_INPUT_LENGHT){
				if(digit != 0 || number1.length() !=0){
					number1 += digit;
					jlDisplayDigit.setText(number1);
				}
			}	
		}
	}

	@Override
	public void keyPressed(KeyEvent e){

	}

	@Override
	public void keyReleased(KeyEvent arg0){
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent e){
		
		switch(e.getKeyChar()){
		
		case '0':	addDigit(0);
					break;
		case '1':	addDigit(1);
					break;
		case '2':	addDigit(2);
					break;
		case '3':	addDigit(3);
					break;
		case '4':	addDigit(4);
					break;
		case '5':	addDigit(5);
					break;
		case '6':	addDigit(6);
					break;
		case '7':	addDigit(7);
					break;
		case '8':	addDigit(8);
					break;
		case '9':	addDigit(9);
					break;
//		case '/':	operationDivision();
//					break;
//		case '*':	operationMultiplication();
//					break;
//		case '-':	operationSubtraction();
//					break;
//		case '+':	operationAddition();
//					break;
//		case 'C':	clean();
//					break;
//		case '=':	equal();
//					break;
//		//case 'BACKSPACE':	backSpace();
//					break;
//		case 'MOD':	operationModuloDivision();
//					break;
//		case 'BIN':	activateBin();
//					break;
//		case 'DEC':	activateDec();
//					break;		
		}
	}
	
}
0

A który komponent ma mieć tego KeyListenera?

0

W sumie chyba bez znaczenia? Najlepiej GridBagLayout ale nie wiem czy się tak da.

1

Musisz dodać słuchacza do buttona, jeżeli dobrze pamiętam to chodzi o focus.

 private void addButton(GridBagLayout layout, JButton button, int col, int row, int gridwidth, int gridheight,int weightx, int weighty){
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = col;
        gbc.gridy = row;
        gbc.gridwidth = gridwidth;
        gbc.gridheight = gridheight;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        gbc.fill = GridBagConstraints.BOTH;
        button.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
        button.setBackground(Color.LIGHT_GRAY);
        button.setFont(new Font("monospaced", Font.BOLD, 21));
        layout.setConstraints(button, gbc);

        button.addKeyListener(this);//HERE
        add(button);
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1