如何将jtextfield添加到具有绘画组件的jpanel中?

时间:2019-05-04 19:32:01

标签: java swing

我正在做一个游戏,我想将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();
    }
}

我想在面板顶部显示文本字段

2 个答案:

答案 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