繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM