我的代码遇到了几个不同的问题,其中大多数是基于GUI的问题,但我确实有一个actionevent问题。我将首先在部分中发布我的代码,然后我将指出每个部分的具体问题。 *注意我的所有代码都将按照我的IDE中的实际顺序排列。
如果您希望复制我的代码而没有其他所有内容,请访问pastebin:http://pastebin.com/HHjRRtGZ
我的进口商品:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; //Makes it a Japplet
import java.util.Random;
我的计划从这里开始:
public class Hangman extends JApplet implements ActionListener {
// How many times you can guess the wrong letter till you lose
static final int DEAD = 7;
private int errors; // amount of errors
private String message; // Message displaying either Error or Victory
private String information; // Secondary Message
private String RealWord; // The Real word
private StringBuffer GuessWord;// The Guessed word
private Button StartBtn; // The Restart Button
private Button GoBtn; // The Go Button
private TextField LetterBox; // The LetterBox
My ActionEvent:
public void actionPerformed(ActionEvent e){
if (e.getSource() == StartBtn){
initGame();
}
if (e.getSource() == GoBtn){
processTurn();
LetterBox.setText("");
repaint();
}
}
问题一:
我对Action事件的问题是,当我点击StartBtn时,它不会重新初始化所有内容。什么都没有清除。什么都没做。它没有做任何事情。那就是那里的问题。
我的init()函数(这是我的一个问题所在。
public void init() {
// Create a "Textbox" for the letter guessing
LetterBox = new TextField();
//Create my buttons and labels
StartBtn = new Button("Restart");
GoBtn = new Button("Go");
//Add the elements to the applet
JPanel p = new JPanel();
p.setLayout(new FlowLayout());
p.add(StartBtn);
p.add(new Label("Guess a letter"));
p.add(LetterBox);
p.add(GoBtn);
add(p, BorderLayout.SOUTH);
//Make buttons event listeners
StartBtn.addActionListener(this);
GoBtn.addActionListener(this);
//Startup the Game
initGame();
}
问题2(主要问题):
我的Init代码影响我的GUI的问题是实际的单词猜测区域和hangman区域有点混乱。这很难解释,所以我会告诉你一个图像。几乎所有表单的背景都是完全透明的。所以它只是使用了它背面的任何物体的静止图像。
问题3: 您可以看到图像存在其他一些问题。但是,这些部分的代码更低了。但是正如你所知道的那样,即使我将它们指定为(你会进一步看到它们),这些消息也不会清除并且只是相互覆盖。
问题4: 在您猜出任何字母之前,这个单词是用“”隐藏的,但是当你猜出这个单词的正确字母时,它应该用猜测的正确字母替换“”。然而,它只是把它放在它上面(你也会看到下面的代码)。
这是游戏初始化程序
public void initGame() {
//Set the errors to 0
errors = 0;
//Enter the wordslist, separated by a | here
String str = "write|program|receive|positive|variables|temporary|good|bad|test";
String[] temp;
//delimiter
String delimiter = "\\|";
// given string will be split by the argument delimiter provided.
temp = str.split(delimiter);
//Create the Random Seed Generator
Random RandGenerator = new Random();
//Generate my Random Number
int randomInt = RandGenerator.nextInt(temp.length);
RealWord = new String(temp[randomInt]);
char positions[] = new char[RealWord.length()];
就在这里,它用“*”替换屏幕上未被认定的字符。
for (int i = 0; i < RealWord.length(); i++) {
positions[i] = '*';
}
String s = new String(positions);
GuessWord = new StringBuffer(s);
LetterBox.setText("");
//Delete Messages
message = "";
information = "";
repaint();
}
我的绘画功能
@Override
public void paint(Graphics g) {
int BaseY = 250;
//THE HANGING STAND
if (errors > 0) { //1 Error
g.drawLine(90, BaseY, 200, BaseY); //The ground
g.drawLine(125, BaseY, 125, BaseY-100); //The bar going up
g.drawLine(125, BaseY-100, 175, BaseY-100); //The sidebar
g.drawLine(175, BaseY-100, 175, BaseY-75); //The Rope
}
//THE PERSON
if (errors > 1) {
g.drawOval(170, BaseY-75, 10, 12); // The Head
}
if (errors > 2) {
g.drawLine(175, BaseY-62, 175, BaseY-45); // The Body
}
if (errors > 3) {
g.drawLine(165, BaseY-65, 175, BaseY-55); // Left Arm
}
if (errors > 4) {
g.drawLine(185, BaseY-65, 175, BaseY-55); // Right Arm
}
if (errors > 5) {
g.drawLine(170, BaseY-30, 175, BaseY-45); //Left Leg
}
if (errors > 6) { //7 Errors
g.drawLine(175, BaseY-45, 180, BaseY-30); // Right Left
}
//Show Messages/Errors
g.drawString(message, 40, BaseY+25);
g.drawString(information, 25, BaseY+45);
g.drawString(new String (GuessWord), 140, BaseY-120);
g.drawString(new String("WELCOME TO HANGMAN!"), 75, 40);
}
这是魔法发生的地方。这是processTurn函数
private void processTurn() {
String s, t;
char a;
s = LetterBox.getText();
a = s.charAt(0);
if (!Character.isLetter(a)) {
message = "Only enter letters please.";
return;
}
if (s.length() > 1) {
message = "One letter at a time please.";
return;
}
//Check if letter has been used already
t = new String(GuessWord);
if (t.indexOf(s) != -1) {
message = "You have already guessed with that letter!";
return;
}
//If the letter you guessed does not occur in the Real Word
if (RealWord.indexOf(s) == -1) {
message = "";
errors++;
if (errors==DEAD) {
message = "Sorry, you lose";
information = "Click restart to try again!";
//INSERT MOVING HANGMAN HERE.
}
return;
}
这是“*”应该用正确的猜测字母替换,但它不能正常工作!
//Replace stars in the Guessed Word with the found letter
for (int i = 0; i < RealWord.length(); i++) {
if (RealWord.charAt(i) == a) {
GuessWord.setCharAt(i, a);
}
}
t = new String(GuessWord);
//If all of the stars have been filled, then you win!
if (t.indexOf('*') == -1) {
message = "You have won!";
return;
}
//Delete the Message
message = "";
repaint();
}
主要功能
public static void main(String[] args) {
JFrame frame = new JFrame();
JApplet applet = new Hangman();
applet.init();
applet.start();
frame.add(applet);
frame.setSize(300, 400);
frame.setLocationRelativeTo(null); // Center the frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
任何和所有的帮助将不胜感激:)提前感谢!
答案 0 :(得分:2)
这是由于你打破了paint
链的基本事实造成的。
AWT / Swing中的绘画是由一系列方法调用组成的。如果你忽略了维护这个链条,你就会以你所看到的形式开始以油漆工件结束。
Graphics
上下文是一个共享资源,也就是说,在任何给定的绘制周期中绘制的每个组件都将被赋予相同的Graphics
资源。在绘制之前,每个组件都应该准备好Graphics
上下文...
要解决此问题,请在所有paint
方法中调用super.paint(g)
以确保维护绘制链,并为单个组件预先添加Graphics
上下文绘画需求。
说完了。建议不要覆盖顶级容器的paint
。相反,建议您使用类似JPanel
的内容执行自定义绘画,并改为覆盖paintComponent
方法(确保您也调用super.paintComponent
!)
这至少有两个基本的好处。首先,您可以知道决定面板的显示位置,例如,您可以根据需要将其添加到JApplet
或JFrame
或其他容器中。它默认是双缓冲的。这意味着更新绘画时不会看到任何闪烁。
您应该考虑将应用程序分解为小面板,分别关注每个组件需求。这将有助于降低应用程序的复杂性,并使管理应用程序每个部分的个性化需求变得更加容易。
答案 1 :(得分:1)
问题是你直接在JApplet
上画画。您不应直接在顶级容器上绘画,例如JFrame
或JApplet
。相反,请使用JComponent
或JPanel
。覆盖paintComponent()
进行绘画而不是paint()
,不要忘记致电super.paintComponent(g)
。
请查看Performing Custom Painting教程以获取更多信息。
考虑通过将所有当前逻辑和绘制移动到将用作applet内容的新JPanel
来重构代码。然后,将此面板添加到applet。
编辑:
问题的根源是在绘制实现时没有调用super.paint()
。覆盖paint()
不是必需的,通常不建议在许多Swing应用程序中使用。 JComponent.paint()
(所有Swing组件的超类)处理绘制Swing组件的内容,边框和子项。而忽略了对super.paint()
的呼唤,你正在扰乱所有这些细节的绘画。
查看A Closer Look at the Paint Mechanism了解有关绘画周期的更多详细信息。