2017-05-13 5 views
0

이 질문에 다소의 문제가 있습니다 만, 입력 상자에 문자열 만 허용하려고 시도 할 수 있습니다. (관련 코드는 그래픽 프로그래밍에 아직 새로운 지저분한 형식에 대해 미안하다.)JOptionPane에서 자바 try/catch 문제가 발생했습니다. 잘못된 ints를 catch해야합니다.

나는 아래 코드를 사용하면 코드가 제대로 동작하지 않을 것이라고 생각했지만 지금은 그렇게 할 수 없다. int가 문자열로 입력 될 때마다 스팅 입력에서 모든 int를 포착합니다. 나는 부울을 사용하려했지만 실제로 작동하지 않았습니다. 또한 당신이 이메일을 볼 수 있다면 try/catch뿐만 아니라 @ 기호가 다소 유사하기 때문에 오류 상자를 팝업합니다. 감사

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.util.ArrayList; 
import java.util.InputMismatchException; 

import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.Timer; 


public class MainPanel extends JPanel { 

    Player myPlayer; 
    Player myOtherPlayer; 
    private int WIDTH = 1000; 
    private int HEIGHT = 1000; 
    private int WALLWIDTH = 100; 
    private int WALLHEIGHT = 100; 
    private ArrayList<Wall> walls = new ArrayList<Wall>(); 
    String Name; 
    String Email; 
    int favNum; 

    Timer myTimer = new Timer(500, new timerListener());  
    JLabel myTimeLabel; 
    int time =1; 

    public MainPanel() 
    { 
     setPreferredSize(new Dimension(WIDTH,HEIGHT)); 
     JLabel myLabel= new JLabel ("Game ends once 30 seconds is receahed:"); 
     myLabel.setFont(new Font("Serif", Font.BOLD,32)); 
     myLabel.setForeground(Color.WHITE); 
     myTimeLabel= new JLabel (Integer.toString(time)); 
     myTimeLabel.setFont(new Font("Serif", Font.BOLD,32)); 
     myTimer.start(); 

     add(myLabel); 
     add(myTimeLabel); 
     myPlayer = new Player(0,100, "toad.png", KeyEvent.VK_UP, KeyEvent.VK_DOWN, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT,this, 50, 38); 
     myOtherPlayer = new Player(200,200, "toad.png", KeyEvent.VK_W, KeyEvent.VK_S, KeyEvent.VK_A, KeyEvent.VK_D,this, 50, 38); 
     createWalls(); 
} 

    public ArrayList<Wall> getWalls() { 
     return walls; 
    } 

    public void createWalls() 
    { 
     int j = 0; 
     for(int i = 0; i < HEIGHT/WALLHEIGHT; i++) 
     { 
      for(int k = 0; k < WIDTH/WALLWIDTH; k++) 
      { 
       if(i == 0 || i == (HEIGHT/WALLHEIGHT-1)) 
       { 
        walls.add(new Wall(k*WALLWIDTH,j,"road.png", 100, 100)); 
       } 

      } 
      j+=WALLHEIGHT; 
     } 
    } 


    private class timerListener implements ActionListener 
    { 


     public void actionPerformed(ActionEvent e) { 
      time++; 
      myTimeLabel.setText(Integer.toString(time)); 
      myTimeLabel.setForeground(Color.WHITE); 
      if(time == 31) 
      { 
       myTimer.stop(); 
      } 
      repaint(); 
     } 

    } 


    public void paintComponent(Graphics page) 
    { 
     super.paintComponent(page); 

     page.drawImage(myPlayer.getImageIcon().getImage(), myPlayer.getX(), myPlayer.getY(), null); 
     page.drawImage(myOtherPlayer.getImageIcon().getImage(), myOtherPlayer.getX(), myOtherPlayer.getY(), null); 


     for(int i = 0; i < walls.size(); i++) 
     { 
      page.drawImage(walls.get(i).getImageIcon().getImage(), walls.get(i).getX(), walls.get(i).getY(), null); 


     } 

     page.setFont(new Font("Arial", Font.PLAIN,32)); 
     page.drawString("Player 1 Score: " + myPlayer.getScore(), 100, 800); 
     page.drawString("Player 2 Score: " + myOtherPlayer.getScore(), 100, 850); 
     myPlayer.checkOffScreen(); 

     if(time == 5) 
     { 
      page.drawString("GAME OVER", WIDTH/2-100, HEIGHT/2); 

      try{ 
       Name = JOptionPane.showInputDialog("What is your name?"); 
       }catch (NumberFormatException e) { 
        if (!Name.matches("^[a-z][a-z ]*[a-z]?$")){ 
        JOptionPane.showInputDialog("You entered a number, this only accepts alphabetical letters. Please enter your name");} 
       } 

      try{ 
       favNum= Integer.parseInt(JOptionPane.showInputDialog("What is your favorite number?")); 
       }catch (NumberFormatException e) { 

       JOptionPane.showInputDialog("You entered a text, this only accepts numbers . Please enter your favorite number");} 

      try{ 
       Email =JOptionPane.showInputDialog("Please enter your email"); 
       }catch (InputMismatchException e) { 
       JOptionPane.showInputDialog("You enter your email incorrectly. Please include an @ sign with it");} 
       } 

      } 

    } 
+0

는 예외가 있으므로 try 블록은 아무 의미가하지 않습니다 발생하지되어있어 더 나은 무엇을 수 있습니다, prompt를 취하는 메소드를 작성해, JOptionPane를 표시해, 캐릭터 라인 치를 돌려줍니다. 그런 다음 while 루프를 사용하여 입력의 유효성을 검사 할 수 있습니다. – MadProgrammer

+0

SO. [mcve]를 제공하십시오. (당신은'paintComponent'의 모든 비 그림 기능을 사용하고 싶습니다) – c0der

답변

0

당신은 오히려 예외를 잡기보다,이 작업을 수행 할 regular expressions를 사용해야합니다. 시도 어획량을하는 것이 좋다, 그러나 당신이 좋아, 어쨌든 그것을 확인해야하기 때문에 당신은 예외로 사용자 입력을 처리해서는 안 :

String regex = "\\d+"; 
String input = JOptionPane.showInputDialog("What is your favorite number?"); 
if (!input.matches(regex)) { 
    JOptionPane.showInputDialog("You entered a text, this only accepts numbers . Please enter your favorite number");} 
}