I have been stock for a couple of hours now lol, not fun but this is why.. I have an app for typing which is to set the background of the button keyboard to a different colour lest say yellow (like highlighted) when typing or key is pressed each button will be highlighted and it will set the background back to white when release.. Well, my KeyListener I think that it doesn't has any focus but I seem to be losing something or not seen it where is that happening..
I had to comment out the adding of the listener because give an exception of null pointer..
I really hope someone can see what I can't or what I missing.. This is a runnable code which will make it easier for you guys to understand whats going on and be able to test it yourself and see what I mean..
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JTextArea;
public class typeTutor extends JFrame implements KeyListener
{
//Individual keyboard rows
String firstRow[] = {"~", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "+", "fill", "BackSpace"};
String secondRow[] = {"Tab", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]", "\\"};
String thirdRow[] = {"Caps", "A", "S", "D", "F", "G", "H", "J", "K", "L", ":", "\"", "fill", "fill", "Enter"};
String fourthRow[] = {"Shift", "Z", "X", "C", "V", "B", "N", "M", ",", ".", "?", "blank", "^"};
String fifthRow[] = {"blank", "blank", "fill", "fill", "fill", "fill", "fill", "fill", "fill", "fill", "", "<", "v", ">"};
private JTextField textField;
//Individual keyboard rows
/*
String firstRow[] = {"~","1","2","3","4","5","6","7","8","9","0","-","+","BackSpace"};
String secondRow[] = {"Tab","Q","W","E","R","T","Y","U","I","O","P","[","]","\\"};
String thirdRow[] = {"Caps","A","S","D","F","G","H","J","K","L",":","\"","Enter"};
String fourthRow[] = {"Shift","Z","X","C","V","B","N","M",",",".","?"," ^" };
String fifthRow[]={" " ,"<" ,"v",">" };
*/
String strText = "";
//all keys without shift key press
String noShift="`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./";
//special characters on keyboard that has to be addressed during key press
String specialChars ="~-+[]\\;',.?";
int keycode;
JTextArea text = new JTextArea();
//Jbuttons corresponding to each individual rows
JButton first[];
JButton second[];
JButton third[];
JButton fourth[];
JButton fifth[];
//default color of the button to be repainted when key released
Color cc = new JButton().getBackground();
//Driver main method to start the application
public static void main(String[] args) {
//launch typing tutor
typeTutor a = new typeTutor();
a.setVisible(true);
}
// No argument constructor to create frame
public typeTutor()
{
super("Type Tutor - My JAC444");
JPanel contentPane = new JPanel() {
@Override
protected void paintComponent(Graphics grphcs) {
Graphics2D g2d = (Graphics2D) grphcs;
Dimension d = this.getSize();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
GradientPaint gp = new GradientPaint(0, 0,
getBackground().brighter().brighter(), 0, d.height,
getBackground().darker().darker());
g2d.setPaint(gp);
g2d.fillRect(0, 0, d.width, d.height);
super.paintComponent(grphcs);
}
};
contentPane.setOpaque(false);
setContentPane(contentPane);
//textField = new JTextField(80);
//text.setEditable(true);
TextFieldHandler handler = new TextFieldHandler();
//set the info label on top
JLabel info = new JLabel("<html> Type some text using your keyboard.The keys you press will be highlighted and text will be displayed.<br> Note : Clicking the buttons with your mouse will not perform any action. <br><br> </html>" );
//set the bold font for info
info.setFont(new Font("Verdana",Font.BOLD,12));
//set the layout and place component in place and pack it
setLayout(new BorderLayout());
//Various panel for the layout
JPanel jpNorth = new JPanel();
JPanel jpCenter = new JPanel();
jpCenter.setPreferredSize(new Dimension(10,10));
JPanel jpKeyboard = new JPanel(new GridBagLayout());
JPanel jpNote = new JPanel();
add(jpNorth, BorderLayout.NORTH);
add(jpNote);
add(jpCenter, BorderLayout.CENTER);
add(jpKeyboard, BorderLayout.SOUTH);
jpNorth.setLayout(new BorderLayout());
jpNorth.add(info, BorderLayout.WEST);
jpNorth.add(info, BorderLayout.SOUTH);
jpCenter.setLayout( new BorderLayout());
jpCenter.add(text, BorderLayout.WEST);
jpCenter.add(text, BorderLayout.CENTER);
jpCenter.setPreferredSize(new Dimension(10,10));
first = new JButton[firstRow.length];
second = new JButton[secondRow.length];
third = new JButton[thirdRow.length];
fourth = new JButton[fourthRow.length];
fifth = new JButton[fifthRow.length];
addKeys(jpKeyboard, 0, firstRow, first);
addKeys(jpKeyboard, 1, secondRow, second);
addKeys(jpKeyboard, 2, thirdRow, third);
addKeys(jpKeyboard, 3, fourthRow, fourth);
addKeys(jpKeyboard, 4, fifthRow, fifth);
//jpCenter.setPreferredSize(new Dimension(10,10));
jpKeyboard.setPreferredSize(new Dimension(800,160));
info.setOpaque(false);
jpNote.setOpaque(false);
jpNorth.setOpaque(false);
jpCenter.setOpaque(false);
jpKeyboard.setOpaque(false);
/*
//add listeners
//getComponent().addKeyListener(this);
text.addKeyListener(this);
// add listeners to all the button
for(JButton b : first)
b.addKeyListener(this);
for(JButton b : second)
b.addKeyListener(this);
for(JButton b : third)
b.addKeyListener(this);
for(JButton b : fourth)
b.addKeyListener(this);
for(JButton b : fifth)
b.addKeyListener(this);
*/
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//set non re-sizable
this.setResizable(false);
//set size of the content pane ie frame
this.getContentPane().setPreferredSize(new Dimension(1100,350));
//set location for the frame
//this.setLocation(150,150);
//init and paint frame
initWidgets();
pack();
this.toFront(); // brings this Window to the front and may make it the focused Window
this.setLocationRelativeTo(null); // Window appears center
}
// Method to initialize frame component
private void initWidgets()
{
}
private class TextAreaHandler implements ActionListener
{
// process textfield events
public void actionPerformed( ActionEvent event )
{
String string = ""; // declare string to display
// user pressed Enter in JTextField textField1
if ( event.getSource() == textField )
string = String.format( "%s",
event.getActionCommand() );
}
}
// Invoked when a key has been pressed.
// @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
public void keyPressed(KeyEvent evt)
{
keycode = evt.getKeyCode();
strText = String.format( "%s",KeyEvent.getKeyText( evt.getKeyCode() ) );
setBackground(Color.BLUE);
}//end of key pressed
//Invoked when a key has been released.
public void keyReleased(KeyEvent evt)
{
keycode = evt.getKeyCode();
strText = String.format( "%s",KeyEvent.getKeyText( evt.getKeyCode() ) );
getBackground();
}
public void keyTyped(KeyEvent evt)
{
strText = String.format( "%s", evt.getKeyChar() );
}//end of key pressed
private class TextFieldHandler implements ActionListener
{
// process textfield events
public void actionPerformed( ActionEvent event )
{
String string = ""; // declare string to display
// user pressed Enter in JTextField textField1
if ( event.getSource() == text )
strText = String.format( "%s", event.getActionCommand() );
}
}
protected void addKeys(JPanel parent, int row, String[] keys, JButton[] buttons) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = row;
gbc.gridx = 0;
gbc.fill = GridBagConstraints.BOTH;
int gap = 0;
for (int index = 0; index < keys.length; index++) {
String key = keys[index];
if ("blank".equalsIgnoreCase(key)) {
gbc.gridx++;
} else if ("fill".equalsIgnoreCase(key)) {
gbc.gridwidth++;
gap++;
} else {
//System.out.println("Add " + key);
JButton btn = new JButton(key);
buttons[index] = btn;
parent.add(btn, gbc);
gbc.gridx += gap + 1;
gbc.gridwidth = 1;
gap = 0;
}
}
}
}//end of class
If you guys need more clarification or have any question about it, please let me know and I will provide as much information as I can. I will really appreciate your help, you how frustrating it gets when you are stock and can't find the answer to the problem.. not fun! :(