gpt4 book ai didi

java - 重绘图形时添加到 Jframe 的 Textfield 消失

转载 作者:行者123 更新时间:2023-11-29 05:05:00 26 4
gpt4 key购买 nike

我在使用 JFrame 文本字段时遇到问题。
我正在尝试制作一个文字游戏,但问题是当我尝试创建文本字段以设置输入然后检查它是否是正确的词时,我已经涵盖了这个词。
问题是,当我尝试添加 Textfield 时,当我将内容呈现给 JFrame 时它会消失。

public teksti() {

setTitle("Hirsipuu");
setSize(leveys,korkeus);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
setLocationRelativeTo(null);
setBackground(Color.white);
jp.add(tf); // adding JtextField (JTextField tf = new JTextField(30);)
add(jp);
}

我的 render() 是这样的(只是为了测试目的)。

private void render() {
BufferStrategy bs = this.getBufferStrategy(); // tehdään uusi bufferi

if (bs == null) {
createBufferStrategy(3);
return;
}

int R = (int) (Math.random( )*256);
int G = (int)(Math.random( )*256);
int B= (int)(Math.random( )*256);
Color randomColor = new Color(R, G, B);
Graphics g = bs.getDrawGraphics();

g.drawString("Arvaa sana", 100 , 100);

g.setColor(Color.white);
g.fillRect(0, 50, leveys, korkeus);
g.setColor(randomColor);
g.setFont(h);
// g.drawLine(0,0,liikey*2-1,liikex);
for(int i = 0; i < salat.size(); i ++) {
g.drawString(salat.get(i),liikex+rand.nextInt(50),liikey+rand.nextInt(50));
}
System.out.println(liikex + " " + liikey);

g.dispose();
bs.show();
g.dispose();
}

我可以让文本框在开始时显示在顶部,但随后它就消失了。
有人知道是否有更好的方法吗?

最佳答案

  • 不要直接在 JFrame 中绘制
  • 相反,如果您需要绘制背景图像,请在 JPanel 的 paintComponent 方法中进行。对于您的目的,这可能比使用 BufferStrategy 效果更好。
  • 然后您可以向此 JPanel 添加组件,例如您的 JTextField。
  • 然后将此 JPanel 添加到您的 JFrame。
  • 始终在您自己的 paintComponent 方法覆盖中调用 super 的 paintComponent 方法。
  • 注意永远不要处置从 JVM 提供给您的 Graphics 对象,例如传递给您的 paintComponent 方法的对象。

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import javax.swing.*;

public class BackgroundPanel extends JPanel {
private static final int PREF_W = 800;
private static final int PREF_H = 600;
private static final Font PROMPT_FONT = new Font(Font.SANS_SERIF, Font.BOLD,
24);
private Paint gradientPaint;
private JTextField textField = new JTextField(20);

public BackgroundPanel() {
int red = (int) (Math.random() * 256);
int green = (int) (Math.random() * 256);
int blue = (int) (Math.random() * 256);
Color color1 = new Color(red, green, blue);
red = (int) (Math.random() * 256);
green = (int) (Math.random() * 256);
blue = (int) (Math.random() * 256);
Color color2 = new Color(red, green, blue);

gradientPaint = new GradientPaint(0, 0, color1, 20, 20, color2, true);

JLabel promptLabel = new JLabel("Input:");
promptLabel.setFont(PROMPT_FONT);
add(promptLabel);
add(textField);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(gradientPaint);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.black);
g.setFont(PROMPT_FONT);
g.drawString("Arvaa sana", 100, 100);
}

@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}

private static void createAndShowGui() {
BackgroundPanel mainPanel = new BackgroundPanel();

JFrame frame = new JFrame("BackgroundPanel");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

关于java - 重绘图形时添加到 Jframe 的 Textfield 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30656681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com