Search code examples
javaswingpaintcomponentrectborder-layout

Cannot add JFrame and JTextField


Here's part of my simple code where I can move rectangle on a frame. When I try to add button and text field on frame, these components are not visible or I can't see rectangle. I also tried adding them first on JPanel and then adding panel on frame. Components were visible but rectangle wasn't. Any suggestions?

public class Buffer extends JPanel implements KeyListener,ActionListener{
public static JFrame frame;
public static JButton button;
public static JTextField field;
public int x;
public int y;

    public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.red);
    g.fillRect(x,y,20,20);
}

public static void main(String args[]){
    Buffer z=new Buffer();
    frame=new JFrame();
    button=new JButton();
    field=new JTextField(); 
    frame.setLayout(new BorderLayout());

    button.setPreferredSize(new Dimension(20,20));
    button.setText("XY");
    button.addActionListener(z);

    field.setPreferredSize(new Dimension(100,20));
    field.setEditable(false);

    frame.setSize(500,500);
    frame.setVisible(true);
    frame.setFocusable(true);
    frame.addKeyListener(z);
    frame.setTitle("TEST");
}
@Override
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode()==KeyEvent.VK_RIGHT){
        x=x+10;
        repaint();
    }
    }
    public void actionPerformed(ActionEvent e){
    field.setText("X- "+x+"       Y- "+y);
    frame.requestFocusInWindow();
}
    }
    }

Solution

    • JFrame by default never to react to KeyEvent, meaning frame.setFocusable(true);

    • have to setFocusable(true) for JPanel, then KeyEvents from KeyListener are firing an desired event(s)