I want to set background color by key pressed event. This is my code (using independent class)
import java.awt.Container; import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; public class KeyCharEx extends JFrame { JLabel la = new JLabel("r=red y=yellow b=blue"); Container c = getContentPane(); public KeyCharEx() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); c.setLayout(new FlowLayout()); c.add(la); c.addKeyListener(new MyKeyListener()); setSize(250, 150); setVisible(true); c.setFocusable(true); c.requestFocus(); } public static void main(String[] args) { new KeyCharEx(); } }
import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; public class MyKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { switch(e.getKeyChar()) { case 'r': KeyCharEx.getContentPane().setBackground(Color.RED); break; case 'y': KeyCharEx.getContentPane().setBackground(Color.YELLOW); break; case 'b': KeyCharEx.getContentPane().setBackground(Color.BLUE); break; case 'q': System.exit(0); } } }
But I can’t use getContentPane with an error “Cannot make a static reference to the non-static method getContentPane() from the type JFrame” How can I solve this problem?
Advertisement
Answer
Your KeyCharEx.getContentPane()
is trying to call a static method in the KeyCharEx
class that does not exist. Well, it exists, but it’s non-static, therefore only accessible when used on an instance of the class. In this case, it might be best to pass the pane as an argument:
// For your KeyCharEx public class KeyCharEx extends JFrame { JLabel la = new JLabel("r=red y=yellow b=blue"); Container c = getContentPane(); public KeyCharEx() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); c.setLayout(new FlowLayout()); c.add(la); c.addKeyListener(new MyKeyListener(c)); setSize(250, 150); setVisible(true); c.setFocusable(true); c.requestFocus(); } public static void main(String[] args) { new KeyCharEx(); } } // For your MyKeyListener public class MyKeyListener extends KeyAdapter { Container pane; public MyKeyListener(Container pane) { this.pane = pane; } public void keyPressed(KeyEvent e) { switch(e.getKeyChar()) { case 'r': pane.setBackground(Color.RED); break; case 'y': pane.setBackground(Color.YELLOW); break; case 'b': pane.setBackground(Color.BLUE); break; case 'q': System.exit(0); } } }
If getContentPane()
is a public method, you could also pass your KeyCharEx
over in a similar way and use keyCharEx.getContentPane()
instead. You’d be calling the method on your KeyCharEx
object, not the class itself.