我正在做一个游戏,我想将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();
}
}
我想在面板顶部显示文本字段
答案 0 :(得分:1)
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()。
阅读Custom Painting的Swing教程中的部分,以获取入门的实际示例。使用演示代码作为您编程的起点。然后,您只需在面板中添加一个JTextField,那么它将是显示文本字段所需的一行代码。
答案 1 :(得分:0)
似乎您想在黑色面板上有一个JTextField。您无需每次在paint()方法中设置面板的颜色。而是将其添加到构造函数中:
public Screen() {
setOpaque(true);
setBackground(Color.BLACK);
//...
}
并删除paint()方法。
此外,如果要对setBounds()方法使用绝对定位,则应在构造函数中将布局设置为null setLayout(null)
。如果使用绝对定位,则还需要明确指定面板的尺寸。但是,我仍然建议您使用一个布局管理器,该管理器还要照顾面板大小。
有关绝对定位的更多信息,请参见this post。