user2107967
user2107967

Reputation:

Java Screen Is Blank

Like the title says, my java screen keeps coming up blank. I want it to show the class shapes and two labels. Let me know if you want to see the other class which deals with drawing lines and xs. This is what I have so far:

---EDIT---

Since ya'll have given me suggestions, I have made some progress. I have removed a decent bit of code from Shapes's paint method and have either moved it into another method or a new class to keep it clean. Shape's is still making by page blank out, but things are looking better. Also, please DO NOT paste code for an answer. As a student, I have been instructed to not copy code. Directions such as "create 3 for loops and make an integer" are considered acceptable. Thank you again! Everyone has been very helpful!

---EDIT--- After talking with a teacher I have successfully separated the graphical components of Shapes and placed them into Moves. Shapes is know asking the questions and working properly. I beleive I still need to make a few adjustments for Moves to draw everything, but I believe that everything will work better now. I'll show ya'll how it looks as of now. Thanks again for helping me get on the right track!

Project1 ( or main )

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 );    
}
}

Here is Shapes:

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;
    }

}  

Here is 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);

}

}

And Line:

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

Upvotes: 0

Views: 1305

Answers (1)

Gilbert Le Blanc
Gilbert Le Blanc

Reputation: 51445

I made a few changes to make sure you won't have a blank screen problem.

I commented out the Shape lines so I could run tests.

First, I added a call to SwingUtilities so that the Swing components would be created and run on the Event Dispatch Thread. This required me to put the Swing code in the Project1 class, leaving the main method to execute the SwingUtilities call. I had the class implement Runnable because that's what the SwingUtilities method call requires.

Second, I added a main JPanel. It's better to add Swing components to a JPanel, and add the JPanel to the JFrame. You'll have more flexibility as you add additional components.

Since the default layout manager for a JPanel is a FLowLayout, I had to add the layout manager to the JPanel constructor. In general, it's better for the human readers of your code (including yourself) to specify the layout manager, even if it's the default. With a complex GUI, you might try two or three different layout managers to get the result you want.

Finally, I commented out the last JFrame repaint. Calling the setVisible method is sufficient.

Try out this code, and see if it resolves your screen problem.

    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();
        }

}

Upvotes: 1

Related Questions