2014-12-03 49 views
0

我创建了一个对话框,并让用户从内存中输入5种颜色。这一切都完全有效,这只是一个轻微的美学问题。在正确输入所有5种颜色或获取一种不正确的颜色后,假设擦除对话框中的内容并打印“对不起!颜色不正确”或“恭喜”的消息。它会打印该消息,但JTextField仍然可以在消息后面看到(留下部分/裁剪)。我尝试使用hide()和remove()方法,但他们似乎并没有工作(或我使用它们不正确),我试图重新制作对话框,但我不能' t似乎仍然解决了这个问题。我在做什么错了/我怎样才能让JTextField在完成后消失?预先感谢您的任何帮助!JTextField将不会完全消失

这里,如果用户输入错误的颜色或让他们在那里的部分正确的(txtName的是JTextField的):

 if(count == 6)//User either finished or entered a color incorrectly 
     {     
      //Entered color incorrectly 
      if(incorrect == true) 
      {      
       txtName.setEnabled(false); //Doesn't work 
       homeScreen.remove(txtName); //Doesn't work 
       labelName.setText("Incorrect! Sorry - Wrong color."); 
       //txtName.removeActionListener(new MyButtonListener()); 
      } 
      else//Correctly finished the game. 
      { 
       labelName.setText("Congratulations - your memory skills are perfect!"); 
       //txtName.removeActionListener(new MyButtonListener()); 
       homeScreen.remove(txtName);//Doesn't work 
      } 
     } 

这里是我的整个程序(我不能让它在后正确地格式化):

package memorygame; 

import java.util.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.FlowLayout; 

public class MemoryGame 
{ 
    private JFrame homeScreen; 
    private JLabel labelName; 
    private JTextField txtName; 
    private JLabel correct; 
    Vector<String> name = new Vector(); 
    private int count = 1; 

    private MyButtonListener listen1 = new MyButtonListener(); 

    //Constructor - Method to be called when MemoryGame object called 
    public void MemoryGame() 
    { 
     homeScreen = new JFrame();  
     homeScreen.setSize(400,200); 
     homeScreen.setTitle("Memory Game"); 
     homeScreen.setDefaultCloseOperation(homeScreen.EXIT_ON_CLOSE); 
     homeScreen.setLayout(new FlowLayout()); 
     labelName = new JLabel(); 
     txtName = new JTextField(10); 
     createContents(); 
     homeScreen.setVisible(true); 
    }//End Constructor 

    //Create components and add them to the window/dialog box 
    private void createContents() 
    {  
     labelName.setText("Enter the color " + count + ":"); 
     System.out.println("The current count is: " + count); 
     homeScreen.add(labelName); 
     homeScreen.add(txtName); 
     txtName.addActionListener(new MyButtonListener());//Allows you to press enter to invoke action 
    } 
    //Upon user hitting enter 
    private class MyButtonListener implements ActionListener 
    { 
     public void actionPerformed (ActionEvent e)//When event occurs 
     { 
      Scanner in = new Scanner (System.in);//For program input 
      String answer = ""; 
      //Make memColor an array for randomized colors 
      /* 

      Random r = new Random(); 
      String[] memColors = new String[5];    
      String[] colors = {"red", "green", "blue", "yellow", "brown", "purple"}; 

      for(int i =0; i < memColors.length; i++) 
      { 
       memColors[i] = colors[r.nextInt(6)]; 
      } 
      */ 
      String memColor1 = "red"; 
      String memColor2 = "black"; 
      String memColor3 = "yellow"; 
      String memColor4 = "green"; 
      String memColor5 = "blue"; 
      boolean incorrect = false; 

      //If answered incorrectly set count to 5(it'll be 6) 
      //And have a boolean for if count== 6 for congrats and failure 
      if(e.getSource() == txtName) 
      { 
       answer = txtName.getText(); 
       System.out.println(answer); 
      } 
      else 
      {}  
      //Check if user entered Correct color, 1= Red, 2= Black, etc. 
      if(count == 1) 
      { 
       if(answer.equalsIgnoreCase(memColor1)) 
       { 
        txtName.setText("");     
       } 
       else 
       {//Needs to be a custom message box 
        count = 5; 
        incorrect = true; 
       }     
      } 
      else if(count == 2) 
      { 
       if(answer.equalsIgnoreCase(memColor2)) 
       { 
        txtName.setText("");  
       } 
       else 
       {     
        count = 5; 
        incorrect = true; 
       }     
      }    
      else if(count == 3) 
      { 
       if(answer.equalsIgnoreCase(memColor3)) 
       { 
        txtName.setText("");     
       } 
       else 
       { 
        count = 5; 
        incorrect = true; 
       } 
      } 
      else if(count == 4) 
      { 
       if(answer.equalsIgnoreCase(memColor4)) 
       { 
        txtName.setText("");     
       } 
       else 
       { 
        count = 5; 
        incorrect = true; 
       } 
      } 
      else if(count == 5) 
      { 
       if(answer.equalsIgnoreCase(memColor5)) 
       { 
        txtName.setText(""); 

       } 
       else 
       { 
        count = 5; 
        incorrect = true; 
       } 
      } 
      else 
      { 
       JOptionPane.showMessageDialog(null, "Something went wrong!"); 
      }    

      count += 1; 
      //User has completed the game or entered a color incorrectly 
      if(count == 6) 
      { 

       if(incorrect == true) //Incorrect color 
       {      
        txtName.setEnabled(false); 
        homeScreen.remove(txtName); 
        labelName.setText("Incorrect! Sorry - Wrong color."); 
        //txtName.removeActionListener(new MyButtonListener()); 
       } 
       else //Completed the game correctly 
       { 
        labelName.setText("Congratulations - your memory skills are perfect!"); 
        //txtName.removeActionListener(new MyButtonListener()); 
        homeScreen.remove(txtName); 
       } 
      } 
      else 
      { 
       labelName.setText("Enter the color " + count + ":"); 
      }    
     }//End Listener   
    }//End Button class 

     public static void main(String[] args) {  

     //Show message box 
     //Randomize colors 
     JOptionPane.showMessageDialog(null, "How good is your memory?\nTry to memorize this color sequence:\n\n red black yellow green blue"); 

     MemoryGame mem = new MemoryGame();   
     mem.MemoryGame();   
    }//End Main 
}// End Class 
+1

尝试使用'txtName.setVisible(false);'而不是'homeScreen.remove(txtName);' – MadProgrammer 2014-12-03 04:22:40

回答

1

使用txtName.setVisible(false);代替homeScreen.remove(txtName);

基本上,如果你想打电话remove,您将需要revalidaterepaint容器......

你还需要确保你的UI是事件调度线程的上下文中创建,看Initial Threads更多细节

+0

谢谢,工作!我不明白事件派发线程的内容是什么,但我会从该链接更多地考虑它。 – Riotson 2014-12-03 04:30:45

+0

这是主要的UI线程,这很重要... – MadProgrammer 2014-12-03 04:31:21

1

更改代码

homeScreen.remove(txtName); 

homeScreen.remove(txtName); 
homeScreen.revalidate(); 
homeScreen.repaint(); 

之所以remove()并不意味着revalidate() + repaint()remove()不是原子的。来电者可能想要执行多个更新,即几个add()remove()调用的序列。 revalidate()基本上“完成”你的“UI更新事务”,repaint()“将它推到屏幕上”。

作为一个方面说明,如果您对变量名称执行小的改进,您的代码将更易于理解和维护。什么是homeScreen?为什么叫labelName - 什么名字?什么是txtName - 什么文字的名字?什么,冰淇淋的count

,我建议如下改进:

  • incorrect - >isIncorrect(也改变if (incorrect == true)if (isIncorrect)
  • homeScreen - >mainFrame或只是frame(因为你只需要一帧)
  • labelName - >infoLabel或只是label(因为您只有一个标签 - 并删除JLabel correct,它未使用)
  • txtName - >answerTextField
  • count - >answerCount

删除变量listen1,它不使用。

另外,如果您查看if (count == 1)和以下四个if子句的代码,它们除了数字之外都是相同的。阵列的完美情况。您可以将变量memColor*转换为数组String[] memColor。或者也许这就是Vector的用途。您可能想要使用ArrayList,但在这种情况下,目前没有人使用Vector

+0

非常感谢您阅读我的整个代码并指出我可以改进的地方并解释重新验证和重绘方法!我目前正在使用这些更新修复我的代码。我曾计划将memColor作为一个数组,但我没有想到将if语句作为数组来做。谢谢! – Riotson 2014-12-03 04:59:33