[英]How add a jtextfield to a jpanel that has paint component?
我正在做一个游戏,我想将JTextField添加到具有Paint Component的JPanel中。 我每16毫秒重新绘制一次JPanel。
我将()文本字段添加到面板上,但是当我单击它时,它仅显示单个帧。 然后,我尝试repaint()文本字段,但现在它正在闪烁。
public class Screen extends JPanel {
public Screen() {
JTextField txt = new JTextField();
txt.setBounds(10, 10, 300, 50);
this.add(txt);
}
@Override
public void paint(Graphics g) {
Graphics2D g2D = (Graphics2D) g;
g2D.setColor(Color.BLACK);
g2D.fillRect(0, 0, this.getWidth(), this.getHeight());
g2D.setColor(Color.WHITE);
g2D.fillRect(0, 0, this.getWidth(), 20);
txt.repaint();
}
}
我想在面板顶部显示文本字段
JTextField txt = new JTextField();
创建JTextField时,应使用如下代码:
JTextField txt = new JTextField(10);
现在,文本字段可以计算自己的首选大小。
//txt.setBounds(10, 10, 300, 50);
不要使用setBounds()来给组件指定大小。 同样,每个Swing组件负责确定其自己的首选大小。 然后,布局管理器将在面板上设置组件的大小/位置。
//public void paint(Graphics g) {
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// add custom painting here
}
不要覆盖paint()。 通过覆盖paintComponent()方法来完成自定义绘制。 并且该方法中的第一条语句应该是super.paintComopnent(g)
//g2D.setColor(Color.BLACK);
//g2D.fillRect(0, 0, this.getWidth(), this.getHeight());
不要绘制面板的背景。 那就是面板的工作,这就是为什么需要super.paintComponent()来确保背景被绘制的原因。
然后,在JPanel类的构造函数中,只需使用setBackground( Color.BLACK )
//txt.repaint();
永远不要在绘画方法中的任何组件上调用repaint()。
阅读Swing教程“ 自定义绘画”中的部分,以获取工作示例,以开始使用。 使用演示代码作为您编程的起点。 然后,您只需将JTextField添加到面板中,因此它将是显示文本字段所需的一行代码。
似乎您想在黑色面板上有一个JTextField。 您无需每次在paint()方法中设置面板的颜色。 而是将其添加到构造函数中:
public Screen() {
setOpaque(true);
setBackground(Color.BLACK);
//...
}
并删除paint()方法。
另外,如果要通过setBounds()方法使用绝对定位,则应在构造函数中将布局设置为null setLayout(null)
。 如果使用绝对定位,则还需要明确指定面板的尺寸。 但是,我仍然建议您使用一个布局管理器,该管理器还要照顾面板大小。 有关绝对定位的更多信息,请参见这篇文章 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.