Java新GUI问题

Java新GUI问题,java,swing,user-interface,awt,Java,Swing,User Interface,Awt,不久前我发布了一个问题。我有不同的问题。就图形处理而言,我已经修改了代码,但仍然不能正常工作 它的底部框架画得非常好(一个按钮等)。除此之外,刽子手游戏本身应该是平局。不是。它根本没有画任何东西。我不知道该怎么办。我快疯了,因为这是我今晚的最后一个项目!谁能帮帮我吗 这是我的代码:(我尽量省略代码,但是如果你需要整个程序来测试你自己 下面是它正在做的事情的图像: 如果我没有弄错的话,我正在使用以下代码行将刽子手游戏部分本身添加到表单中: private Hangman.Hangman_Pane

不久前我发布了一个问题。我有不同的问题。就图形处理而言,我已经修改了代码,但仍然不能正常工作

它的底部框架画得非常好(一个按钮等)。除此之外,刽子手游戏本身应该是平局。不是。它根本没有画任何东西。我不知道该怎么办。我快疯了,因为这是我今晚的最后一个项目!谁能帮帮我吗

这是我的代码:(我尽量省略代码,但是如果你需要整个程序来测试你自己

下面是它正在做的事情的图像:

如果我没有弄错的话,我正在使用以下代码行将刽子手游戏部分本身添加到表单中:

private Hangman.Hangman_Panel canvas = new Hangman.Hangman_Panel();

//Constructor
public Hangman() { 

    this.add(canvas, BorderLayout.CENTER); // Add canvas to center  

快速尝试代码会出现一个明显的异常,即您忘记在paint方法上检查字符串是否为null

g.drawString(message, 40, BaseY+25);
g.drawString(information, 25, BaseY+45);
g.drawString(new String (GuessWord), 140, BaseY-120);

我知道你的家庭作业很快就要交了,但我强烈建议你,把它看作是对你未来编程生涯的一项投资。

快速尝试你的代码会给你一个明显的例外,你忘记在画图方法上检查字符串是否为null

g.drawString(message, 40, BaseY+25);
g.drawString(information, 25, BaseY+45);
g.drawString(new String (GuessWord), 140, BaseY-120);

我知道你的作业很快就要交了,但我强烈建议你,把它看作是对你未来编程生涯的一项投资。

至少有三个问题对你不利

首先。。。 您正在覆盖
绘制
,但调用了
super.paintComponent
。这是一个非常糟糕的主意,您跳过了绘制链中的一系列链接

相反,重写
paintComponent
并调用
super.paintComponent

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    //...
其次
paint
方法中依赖的某些值尚未初始化

g.drawString(message, 40, BaseY + 25);
g.drawString(information, 25, BaseY + 45);
第一次调用
paint
时,
消息
信息
null
,导致
NullPointerException

作为旁注,
新字符串(“欢迎来到HANGMAN!”)
通常是不必要的。
欢迎来到HANGMAN!”
不需要通过
字符串
构造函数,编译器将自动为您完成此操作

你可以用

g.drawString("WELCOME TO HANGMAN!", 75, 40);
取而代之的是…(但是
GuessWord
仍然是
null
),首先尝试初始化这些值,例如

private String message = "";   // Message displaying either Error or Victory
private String information = ""; // Secondary Message
private String RealWord = "";      // The Real word
private StringBuffer GuessWord = new StringBuffer();// The Guessed word
第三 你混合了重(AWT)和轻(Swing)两种成分。它们往往不能很好地结合在一起

我建议改用
JButton
JLabel
JTextField


此外,您可能会通过阅读获得一些帮助。这将使您的代码更容易让其他人阅读…

至少有三个问题对您不利

首先。。。 您正在覆盖
绘制
,但调用了
super.paintComponent
。这是一个非常糟糕的主意,您跳过了绘制链中的一系列链接

相反,重写
paintComponent
并调用
super.paintComponent

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    //...
其次
paint
方法中依赖的某些值尚未初始化

g.drawString(message, 40, BaseY + 25);
g.drawString(information, 25, BaseY + 45);
第一次调用
paint
时,
消息
信息
null
,导致
NullPointerException

作为旁注,
新字符串(“欢迎来到HANGMAN!”)
通常是不必要的。
欢迎来到HANGMAN!”
不需要通过
字符串
构造函数,编译器将自动为您完成此操作

你可以用

g.drawString("WELCOME TO HANGMAN!", 75, 40);
取而代之的是…(但是
GuessWord
仍然是
null
),首先尝试初始化这些值,例如

private String message = "";   // Message displaying either Error or Victory
private String information = ""; // Secondary Message
private String RealWord = "";      // The Real word
private StringBuffer GuessWord = new StringBuffer();// The Guessed word
第三 你混合了重(AWT)和轻(Swing)两种成分。它们往往不能很好地结合在一起

我建议改用
JButton
JLabel
JTextField


此外,您可能会发现通读一些帮助。这将使您的代码更容易让其他人阅读…

您仍在跟进上一个问题的答案,而这个问题对于StackOverflow来说实在太宽泛了。我不会说您的代码太多-但如果您这样做了,它是否在应用中也不会有任何区别或者在这里。最好放在这里,这样我们就不必在问题和代码之间来回点击。我怀疑“代码太多了”批评的焦点应该是你没有制作一个小程序来演示你的问题;而不是代码在页面上占用了多少空间。如果你将
super.paintComponent(g);
更改为
super.paint(g);
?同样的结果(我也为你更改了页面的格式:)如果在我启动表单时有什么不同的话,这些错误会显示在输出控制台中:好的,我现在有点忙,但是如果那时没有其他人给你答案的话,我将在大约8个小时左右的时间内对此进行调查。你仍然在跟进上一个问题的答案,这个问题对于StackOverflow来说实在太广泛了哦。我不会说你有太多的代码——但是如果你有,它在pastebin还是在这里都没有什么区别。最好是在这里,这样我们就不必在问题和代码之间来回点击。我怀疑“代码太多”批评的焦点应该是你没有制作一个小程序来演示你的问题;而不是代码在页面上占用了多少空间。如果你将
super.paintComponent(g);
更改为
super.paint(g);
?同样的结果(我也为你更改了页面的格式:)如果在我启动表单时有什么不同的话,这些错误会显示在输出控制台中:好的,我现在有点忙,但是如果没有其他人给你答案的话,大约8小时后我会有时间调查这个问题