2013-02-25 6 views
0

Как и в названии, мой экран java продолжает оставаться пустым. Я хочу, чтобы он отображал формы классов и две метки. Дайте мне знать, если вы хотите увидеть другой класс, который касается линий рисования и xs. Это то, что я до сих пор:Java Screen Is Blank

--- EDIT ---

С ya'll дали мне предложения, я сделал некоторые успехи. Я удалил достойный бит кода из метода Paint Shapes и переместил его в другой метод или новый класс, чтобы сохранить его в чистоте. Shape по-прежнему делает страницу пустой, но все выглядит лучше. Кроме того, НЕ Вставляйте код для ответа. Будучи студентом, мне было поручено не копировать код. Такие направления, как «создать 3 для циклов и сделать целое число», считаются приемлемыми. Еще раз спасибо! Все были очень полезны!

--- EDIT --- После разговора с учителем я успешно отделил графические компоненты фигур и поместил их в Moves. Формы знают, задают вопросы и работают правильно. Я верю, что мне все еще нужно внести несколько корректировок для Moves, чтобы нарисовать все, но я считаю, что теперь все будет работать лучше. Я покажу, как это будет выглядеть. Еще раз спасибо за то, что помогли мне встать на правильный путь!

Project1 (или основной)

import java.awt.*; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.SwingUtilities; 

public class Project1 implements Runnable{ 
public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Project1()); 
} 

@Override 
     public void run(){ 
    //Asterick a = new Asterick(); 
    //fsu title bar and footer 
    JLabel header = new JLabel("FSU"); 
    JLabel footer = new JLabel("By Jared Scott"); 

    //CREATE EVERYTHING 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel panel = new JPanel(new BorderLayout()); 

    frame.setSize(400, 700); 

    Shapes as = new Shapes(); 
    //Asterick as = new Asterick(); 
    String message = 
        String.format("Enter a number from" 
      + " 1-9 to play tick tack toe.\n" + "The order of squares is\n" + 
      "1  4  7\n2  5  8\n3  6  9" + 
        "\nThe game ends when one player has three Xs or Os" + 
        " in a row."); 

    JOptionPane.showMessageDialog(null, message); 

    //this works 
    panel.add(header, BorderLayout.NORTH); 
    panel.add(footer, BorderLayout.SOUTH); 

    panel.add(as, BorderLayout.CENTER); 
    frame.add(panel); 

    frame.setVisible(true);  
} 
} 

Вот Формы:

public class Shapes extends JPanel{ 

//put graphics inside of moves 
//shapes will send an int for moves to interpret 
private int answer; 
int[] locationFill = new int[ 9 ]; 
Moves move; 
private int turn = 0; 
char x = 'x'; 
char o = 'o'; 

public Shapes(){ 
    setBackground(Color.WHITE); 
    ask();  
} 

public void ask(){ 

    String tryAgain = 
        String.format("Already in use. Please choose again."); 

    while(getTurn() <= 9){ 

     goesNext(getTurn()); 

     String input = JOptionPane.showInputDialog("Choose your square"); 
     answer = Integer.parseInt(input); 

    //put these in pop up questions 

    switch(answer){  

     case 1: 
      if(!isEmpty(answer)){ 
       JOptionPane.showMessageDialog(null, tryAgain); 
      } else if(whatToDraw(answer) == true){ 
       move = new Moves(answer, x); 
       locationFill[0] = 1; 
       turn++; 
       won(); 
      } else { 
       move = new Moves(answer, o);  
       locationFill[0] = 2; 
       turn++; 
       won(); 
      } 
      break; 

     case 2: 
      if(!isEmpty(answer)){ 
       JOptionPane.showMessageDialog(null, tryAgain); 
      }else if(whatToDraw(answer) == true ){ 
       move = new Moves(answer, x); 
       locationFill[1] = 1; 
       turn++; 
       won(); 
      }else{ 
       move = new Moves(answer, o); 
       locationFill[1] = 2; 
       turn++; 
       won(); 
      } 
      break; 

     case 3: 
      if(!isEmpty(answer)){ 
       JOptionPane.showMessageDialog(null, tryAgain); 
      }else if(whatToDraw(answer) == true ){ 
       move = new Moves(answer, x);  
       locationFill[2] = 1; 
       turn++; 
       won(); 
      }else{ 
       move = new Moves(answer, o); 
       locationFill[2] = 2; 
       turn++; 
       won(); 
      } 
      break; 

     case 4: 
      if(!isEmpty(answer)){ 
       JOptionPane.showMessageDialog(null, tryAgain); 
      }else if(whatToDraw(answer) == true ){ 
       move = new Moves(answer, x);    
       locationFill[3] = 1; 
       turn++; 
       won(); 
      }else{ 
       move = new Moves(answer, o); 
       locationFill[3] = 2; 
       turn++; 
       won(); 
      } 
      break; 

     case 5: 
      if(!isEmpty(answer)){ 
       JOptionPane.showMessageDialog(null, tryAgain); 
      }else if(whatToDraw(answer) == true ){ 
       move = new Moves(answer, x);   
       locationFill[4] = 1; 
       turn++; 
       won(); 
      }else{ 
       move = new Moves(answer, o); 
       locationFill[4] = 2; 
       turn++; 
       won(); 
      } 
      break; 

     case 6: 
      if(!isEmpty(answer)){ 
       JOptionPane.showMessageDialog(null, tryAgain); 
      }else if(whatToDraw(answer) == true ){ 
       move = new Moves(answer, x); 
       locationFill[5] = 1; 
       turn++; 
       won(); 
      }else{ 
       move = new Moves(answer, o); 
       locationFill[5] = 2; 
       turn++; 
       won(); 
      } 
      break; 

     case 7: 
      if(!isEmpty(answer)){ 
       JOptionPane.showMessageDialog(null, tryAgain); 
      }else if(whatToDraw(answer) == true){ 
       move = new Moves(answer, x); 
       locationFill[6] = 1; 
       turn++; 
       won(); 
      }else{ 
       move = new Moves(answer, o);  
       locationFill[6] = 2; 
       turn++; 
       won(); 
      } 
      break; 

     case 8: 
      if(!isEmpty(answer)){ 
       JOptionPane.showMessageDialog(null, tryAgain); 
      }else if(whatToDraw(answer) == true ){ 
       move = new Moves(answer, x); 
       locationFill[7] = 1; 
       turn++; 
       won(); 
      }else{ 
       move = new Moves(answer, o); 
       locationFill[7] = 2; 
       turn++; 
       won(); 
      } 
      break; 

     case 9: 
      if(!isEmpty(answer)){ 
       JOptionPane.showMessageDialog(null, tryAgain); 
      }else if(whatToDraw(answer) == true ){ 
       move = new Moves(answer, x);   
       locationFill[8] = 1; 
       turn++; 
       won(); 
      }else{ 
       move = new Moves(answer, o); 
       locationFill[8] = 2; 
       turn++; 
       won(); 
      } 
      break; 

     default: 
      System.out.println("Somethings wrong"); 
      break; 
    }//end switch 

    tie(); 

    }//end while 
    } 

public void goesNext(int turn){ 
String player1 = 
        String.format("Player1's Turn"); 
String player2 = 
        String.format("Player2's Turn"); 

if(turn == 0 || turn % 2 == 0){ 
     JOptionPane.showMessageDialog(null, player1); 
}else{ 
     JOptionPane.showMessageDialog(null, player2); 
} 
} 

public boolean isEmpty(int i){ 

    boolean answer2 = true; 

if(locationFill[ i - 1 ] == 0){ 
    answer2 = true; 
}else if(locationFill[ i - 1 ] == 1 || locationFill[ i - 1 ] == 2){ 
    answer2 = false; 
} 
    return answer2; 
}//end isEmpty 

     public void won(){ 

    String message = 
        String.format("Three in a row!\nPlayer2 win!"); 
    String message2 = 
        String.format("Three in a row!\nPlayer1 win!"); 

    if((locationFill[0] == 1 && locationFill[1] == 1 && 
      locationFill[2] == 1) || (locationFill[3] == 1 && 
      locationFill[4] == 1 && 
      locationFill[5] == 1) || (locationFill[6] == 1 && 
      locationFill[7] == 1 && 
      locationFill[8] == 1) || (locationFill[0] == 1 && 
      locationFill[4] == 1 && 
      locationFill[8] == 1) || (locationFill[1] == 1 && 
      locationFill[4] == 1 && 
      locationFill[7] == 1) || (locationFill[0] == 1 && 
      locationFill[3] == 1 && 
      locationFill[6] == 1) || (locationFill[2] == 1 && 
      locationFill[5] == 1 && 
      locationFill[8] == 1) || (locationFill[6] == 1 && 
      locationFill[4] == 1 && 
      locationFill[2] == 1)){ 
    JOptionPane.showMessageDialog(null, message); 
    System.exit(0); 
    } 

    if((locationFill[0] == 2 && locationFill[1] == 2 && 
      locationFill[2] == 2) || (locationFill[3] == 2 && 
      locationFill[4] == 2 && 
      locationFill[5] == 2) || (locationFill[6] == 2 && 
      locationFill[7] == 2 && 
      locationFill[8] == 2) || (locationFill[0] == 2 && 
      locationFill[4] == 2 && 
      locationFill[8] == 2) || (locationFill[1] == 2 && 
      locationFill[4] == 2 && 
      locationFill[7] == 2) || (locationFill[0] == 2 && 
      locationFill[3] == 2 && 
      locationFill[6] == 2) || (locationFill[2] == 2 && 
      locationFill[5] == 2 && 
      locationFill[8] == 2) || (locationFill[6] == 2 && 
      locationFill[4] == 2 && 
      locationFill[2] == 2)){ 
    JOptionPane.showMessageDialog(null, message2); 
    System.exit(0); 
} 

}//end won 

public int getTurn(){ 
    return turn; 
} 

    public void tie(){ 
if(locationFill[0] != 0 && locationFill[1] != 0 && 
      locationFill[2] != 0 && locationFill[3] != 0 
      && locationFill[4] != 0 && locationFill[5] != 0 
      && locationFill[6] != 0 && locationFill[7] != 0 
        && locationFill[8] != 0){ 
      String tie = 
        String.format("It's a tie!"); 
      String gameOver = 
        String.format("Game Over"); 
      JOptionPane.showMessageDialog(null, tie); 
      JOptionPane.showMessageDialog(null, gameOver); 
      System.exit(0); 
} 
}//end tie 

public boolean whatToDraw(int choice){ 
     boolean a; 
    if(locationFill[ choice - 1 ] == 0 && turn % 2 == 0){ 
     a = true; 
    }else{ 
     a = false; 
    } 
    return a; 
    } 

} 

Здесь вы Moves:

public class Moves extends JPanel{ 

Line[] x = new Line[ 18 ]; 
int choice = 0; 
char letter; 
public Line[] lines = new Line[ 6 ]; 

public Moves(){ 
} 

public Moves(int i, char a){ 

    letter = a; 
    choice = i; 

    //for graph 
    lines[ 0 ] = new Line(30, 330, 350, 330, Color.BLACK); 
    lines[ 1 ] = new Line(30, 225, 350, 225, Color.BLACK); 
    lines[ 2 ] = new Line(250, 130, 250, 440, Color.BLACK); 
    lines[ 3 ] = new Line(125, 130, 125, 440, Color.BLACK); 

    //create header and footer 
    lines[ 4 ] = new Line(0, 70, 400, 70, Color.BLACK); 
    lines[ 5 ] = new Line(0, 600, 400, 600, Color.BLACK); 

    x[0] = new Line(118, 220, 30, 130, Color.BLACK);//1 
    x[1] = new Line(30, 220, 118, 130, Color.BLACK); 
    x[2] = new Line(118, 320, 30, 230, Color.BLACK);//2               
    x[3] = new Line(30, 320, 118, 230, Color.BLACK); 
    x[4] = new Line(122, 440, 34, 335, Color.BLACK);//3               
    x[5] = new Line(34, 440, 122, 335, Color.BLACK); 

    x[6] = new Line(230, 220, 145, 130, Color.BLACK);//4 
    x[7] = new Line(145, 220, 230, 130, Color.BLACK); 
    x[8] = new Line(230, 320, 145, 230, Color.BLACK);//5               
    x[9] = new Line(145, 320, 230, 230, Color.BLACK); 
    x[10] = new Line(230, 440, 145, 335, Color.BLACK);//6              
    x[11] = new Line(145, 440, 230, 335, Color.BLACK); 

    x[12] = new Line(345, 220, 260, 130, Color.BLACK);//7 
    x[13] = new Line(260, 220, 345, 130, Color.BLACK); 
    x[14] = new Line(345, 320, 260, 230, Color.BLACK);//8               
    x[15] = new Line(260, 320, 345, 230, Color.BLACK); 
    x[16] = new Line(345, 440, 260, 335, Color.BLACK);//9              
    x[17] = new Line(260, 440, 345, 335, Color.BLACK); 
} 

@Override 
public void paintComponent(Graphics g){ 

super.paintComponent(g); 

    for(Line line : lines){ 
     line.draw(g); 
    } 
} 

//this will draw the Xs 
public void drawX1(Graphics g){ 
    x[0].draw(g); 
    x[1].draw(g); 
} 

public void drawX2(Graphics g){ 
    x[0].draw(g); 
    x[1].draw(g);   
} 

public void drawX3(Graphics g){ 
    x[0].draw(g); 
    x[1].draw(g);  
} 

public void drawX4(Graphics g){ 
    x[0].draw(g); 
    x[1].draw(g); 

} 

public void drawX5(Graphics g){ 
    x[0].draw(g); 
    x[1].draw(g); 

} 

public void drawX6(Graphics g){ 
    x[0].draw(g); 
    x[1].draw(g); 

} 

public void drawX7(Graphics g){ 
    x[0].draw(g); 
    x[1].draw(g); 

} 

public void drawX8(Graphics g){ 
    x[0].draw(g); 
    x[1].draw(g); 

} 

public void drawX9(Graphics g){ 
    x[0].draw(g); 
    x[1].draw(g); 

} 
//this will draw the Os 
public void drawO1(Graphics g){ 
    g.drawOval(40, 135, 75, 75); 

} 

public void drawO2(Graphics g){ 
    g.drawOval(40, 230, 75, 95); 

} 

public void drawO3(Graphics g){ 
    g.drawOval(40, 350, 75, 90); 

} 

public void drawO4(Graphics g){ 
    g.drawOval(135, 120, 100, 90); 

} 

public void drawO5(Graphics g){ 
    g.drawOval(140, 230, 95, 100); 

} 

public void drawO6(Graphics g){ 
    g.drawOval(150, 350, 80, 90); 

} 

public void drawO7(Graphics g){ 
    g.drawOval(265, 130, 80, 80); 

} 

public void drawO8(Graphics g){ 
    g.drawOval(265, 225, 80, 100); 

} 

public void drawO9(Graphics g){ 
    g.drawOval(260, 350, 85, 90); 

} 

} 

И линия:

import java.awt.Color; 
import java.awt.Graphics; 

//this will be for the 4 lines needed for tick tac toe 
public class Line { 

private int x1, 
     y1, 
     x2, 
     y2; 
private Color myColor; 

//this is for grid 
public Line(int x1, int y1, int x2, int y2, Color color){ 

    //set coordinants 
    this.x1 = x1; 
    this.y1 = y1; 
    this.x2 = x2; 
    this.y2 = y2; 
    myColor = color; 
}//end constructor 

public void draw(Graphics g){ 

    g.setColor(myColor); 
    g.drawLine(x1, y1, x2, y2); 
}//end draw 
}//end class 
+2

Я запустил ваш код, прокомментировал строки о Shape, и после диалога с сообщением я получил окно с «FSU» и сверху и «By Jared Scott» внизу. Это ожидается.Необходимо увидеть класс Shape, чтобы помочь дальше. – NickJ

+0

Что такое класс Shapes? вы можете показать свой код? –

+0

ОК, я добавил. Таким образом, вы не смущены, это создает линии, которые либо станут Xs, либо графиком для метки tac. Он рисует их также после интерпретации ответа, поставленного в инструкции switch. – 2013-02-25 17:24:32

ответ

1

Я сделал несколько изменений, чтобы убедиться, что у вас не будет проблемы с пустым экраном.

Я прокомментировал строки формы, чтобы я мог запускать тесты.

Во-первых, я добавил вызов SwingUtilities, чтобы компоненты Swing были созданы и запущены в Thread Dispatch Thread. Это потребовало, чтобы я поместил код Swing в класс Project1, оставив основной метод выполнить вызов SwingUtilities. У меня был класс Runnable, потому что это требует метод SwingUtilities.

Во-вторых, я добавил основной JPanel. Лучше добавить компоненты Swing в JPanel и добавить JPanel в JFrame. При добавлении дополнительных компонентов у вас будет больше гибкости.

Поскольку диспетчер компоновки по умолчанию для JPanel является FLowLayout, мне пришлось добавить диспетчер компоновки в конструктор JPanel. В общем, для читателей вашего кода (включая вас самих) лучше указать диспетчер компоновки, даже если это значение по умолчанию. С помощью сложного графического интерфейса вы можете попробовать два или три разных менеджера компоновки, чтобы получить желаемый результат.

Наконец, я прокомментировал последнюю переписку JFrame. Вызов метода setVisible достаточно.

Пробуйте этот код и выясните, разрешает ли он проблему с экраном.

import java.awt.BorderLayout; 

    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JOptionPane; 
    import javax.swing.JPanel; 
    import javax.swing.SwingUtilities; 

    public class Project1 implements Runnable { 

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

     @Override 
     public void run() { 
      // CREATE EVERYTHING 
      JFrame app = new JFrame(); 
      app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      JPanel panel = new JPanel(new BorderLayout()); 

      // fsu title bar and footer 
      JLabel header = new JLabel("FSU"); 
      JLabel footer = new JLabel("By Jared Scott"); 
      // Shapes shape = new Shapes(); 
      String message = String.format("Enter a number from" 
        + " 1-9 to play tick tack toe.\n" + "The order of squares is\n" 
        + "1  4  7\n2  5  8\n3  6  9" 
        + "\nThe game ends when one player has three Xs or Os" 
        + " in a row.\nPlayer1 starts first."); 
      JOptionPane.showMessageDialog(null, message); 

      // app.add(shape); 
      panel.add(header, BorderLayout.NORTH); 
      panel.add(footer, BorderLayout.SOUTH); 

      app.add(panel); 
      app.setSize(400, 700); 
      app.setVisible(true); 

      // app.validate(); 
    //  app.repaint(); 
     } 

} 
+0

Прошу прощения, я не думаю, что у меня недостаточно подробностей. Я пытаюсь установить класс под названием Shapes, который будет рисовать сетку с тиксовым таковым, принять вход пользователя и нарисовать Xs и Os на экране. Вам нужно увидеть класс Shapes? – 2013-02-25 17:17:56

+0

Нет, но это другой вопрос. Формы (лучшее имя; PlayArea) должны расширять JPanel и переопределять paintComponent. Фактические ходы должны храниться в классе Move. Список будет отслеживать все ходы. PlayArea будет рисовать сетку и рисовать движения каждый раз, когда вызывается метод paintComponent. Вы добавили бы PlayArea к основному JPanel в центре макета границы. –

+0

Я собираюсь попытаться комбинировать фигуры и Asterick, которые рисуют сетку. Я собираюсь создать два компонента краски и посмотреть, что это делает. – 2013-02-26 01:10:23