我正在使用jtextfield,但它没有显示。从弄乱代码中,我认为它正在被绘制过来。我在文本字段上遇到的另一个问题是,当我重新验证它时,它的大小从我需要的大小更改为整个屏幕。我通过在循环中设置大小来处理这个问题。如果有更好的方法可以做到这一点,我希望它,但我的首要任务是首先让它可见。这是代码。提前谢谢。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package clientgui;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JTextField;
/**
*
* @author Zzzz
*/
public class ClientGUI extends JFrame{
/**
* @param args the command line arguments
*/
Socket s ;
PrintWriter out;
String username;
BufferedReader in;
ListeningThread lt;
Image dbi;
Graphics dbg;
JTextField textField;
BufferedImage background;
public ClientGUI() throws IOException, InterruptedException
{
background = ImageIO.read(new File("Background.png"));
s = new Socket("127.0.0.1", 4382);
out = new PrintWriter(s.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
lt = new ListeningThread(s);
lt.start();
setTitle("Simple Chat");
setSize(500,500);
setDefaultCloseOperation(3);
setVisible(true);
textField = new JTextField();
textField.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
out.println(textField.getText());
}
});
add(textField);
while(true)
{
textField.setBounds(100, 420, 325, 25);
textField.repaint();
Thread.sleep(20);
}
}
@Override
public void paint(Graphics g)
{
dbi = createImage(getWidth(), getHeight());
dbg = dbi.getGraphics();
paintComponent(dbg);
g.drawImage(dbi, 0, 0, rootPane);
}
public void paintComponent(Graphics g)
{
g.setColor(Color.white);
g.drawImage(background, 0, 0, rootPane);
g.drawString((String) ListeningThread.messages.get(0), 50, 65);
repaint();
}
public static void main(String[] args) throws IOException, InterruptedException {
new ClientGUI();
}
}
有一篇关于Swing和AWT如何在Oracle网站上进行绘画的好文章。我强烈建议您阅读它。在关于 Swing 的绘画方法的部分中,它解释了您面临的错误。
1.你覆盖paint()
(大错误)
基本上,paint()
是重新绘制所有内容的方法,而paintComponent()
是放置自定义代码的地方。paint()
实际上调用这些函数(按顺序):
protected void paintComponent(Graphics g)
protected void paintBorder(Graphics g)
protected void paintChildren(Graphics g)
当您覆盖油漆时,您根本无法通过paintChildren()
绘制文本框。引用文章:
Swing 程序应覆盖
paintComponent()
而不是覆盖paint()
阿拉伯数字。你打电话给repaint()
(小错误)
同一篇文章还有一个关于重新绘制通常如何工作的部分。一种非常简化的查看方法是,当 AWT 事件处理线程到达它时,调用repaint()
将在不久的将来安排对paint()
的调用。您无需在paintComponent()
内调用repaint()
。
TL;博士
- 你应该把你所拥有的一切都放在
paint()
paintComponent()
. - 不要在
paintComponent()
结束时打电话给repaint()
.