1

这是我可以在框架上移动矩形的简单代码的一部分。当我尝试在框架上添加按钮和文本字段时,这些组件不可见或我看不到矩形。我还尝试先添加它们JPanel,然后在框架上添加面板。组件可见,但矩形不可见。有什么建议么?

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();
}
    }
    }
4

2 回答 2

3
  • JFrame默认情况下从不响应KeyEvent,意思是frame.setFocusable(true);

  • 必须setFocusable(true)for JPanel,然后KeyEventsfromKeyListener正在触发所需的事件


于 2013-07-15T08:46:14.653 回答
1

要将组件添加到框架中,您必须获取框架的容器,然后将组件添加到容器中。

例如一个示例程序

import javax.swing.*;
import java.awt.*;

public class Test
{
JFrame f;
Container c;
JButton btn;
JTextField tf;
public Test() //constructor
{

f=new JFrame("Swah!");
f.setBounds(50,50,300,300); //position and dimension of frame

c=f.getContentPane();// getting container of the frame
c.setLayout(new FlowLayout()); //if you do not use layout then only one 
//component will be visible to you.

btn=new JButton("OK");
tf=new JTextField(20);

c.add(btn);
c.add(tf);

f.setVisible(true);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
}

public static void main(String []val)
{
Test tobj=new Test();
}

}

您可以根据输出使用布局,有 Flowlayout、GridLayout 和 GridBagLayout 等布局。

希望这对您有所帮助。

于 2013-07-15T10:35:14.320 回答