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