定义 paint() 时 Java 组件未显示



我正在使用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()实际上调用这些函数(按顺序):

  1. protected void paintComponent(Graphics g)
  2. protected void paintBorder(Graphics g)
  3. protected void paintChildren(Graphics g)

当您覆盖油漆时,您根本无法通过paintChildren()绘制文本框。引用文章:

Swing 程序应覆盖paintComponent()而不是覆盖paint()

阿拉伯数字。你打电话给repaint()(小错误)

同一篇文章还有一个关于重新绘制通常如何工作的部分。一种非常简化的查看方法是,当 AWT 事件处理线程到达它时,调用repaint()将在不久的将来安排对paint()的调用。您无需在paintComponent()内调用repaint()

TL;博士

  1. 你应该把你所拥有的一切都放在paint()paintComponent().
  2. 不要在paintComponent()结束时打电话给repaint().

相关内容

  • 没有找到相关文章

最新更新