0

タイトルが示すように、Java 画面が空白のままになります。クラスの形状と 2 つのラベルを表示したいと考えています。線と x の描画を処理する他のクラスを見たい場合はお知らせください。これは私がこれまでに持っているものです:

- -編集 - -

アドバイスをいただいたので、少し前進しました。Shapes の paint メソッドから適切なコードを削除し、それを別のメソッドまたは新しいクラスに移動してクリーンに保ちました。Shape's はまだページを白紙にして作成していますが、状況は良くなっています。また、回答のコードを貼り付けないでください。学生として、私はコードをコピーしないように指示されました。「3 つの for ループを作成し、整数を作成する」などの指示は、許容されると見なされます。ありがとうございました!皆様大変お世話になりました!

---編集--- 先生と話した後、シェイプのグラフィカル コンポーネントを分離し、ムーブに配置することに成功しました。形状は、質問をして適切に機能することを知っています。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;
    }

}  

ここに動きがあります:

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
4

1 に答える 1

1

空白の画面の問題が発生しないように、いくつかの変更を加えました。

テストを実行できるように、Shape 行をコメントアウトしました。

まず、Swing コンポーネントが作成され、イベント ディスパッチ スレッドで実行されるように、SwingUtilities への呼び出しを追加しました。これには、Swing コードを Project1 クラスに配置する必要があり、main メソッドは SwingUtilities 呼び出しを実行する必要がありました。クラスに Runnable を実装させました。これは、SwingUtilities メソッドの呼び出しに必要なものだからです。

次に、メインの JPanel を追加しました。Swing コンポーネントを JPanel に追加し、JPanel を JFrame に追加することをお勧めします。コンポーネントを追加すると、柔軟性が高まります。

JPanel のデフォルトのレイアウト マネージャーは FLowLayout であるため、レイアウト マネージャーを JPanel コンストラクターに追加する必要がありました。一般に、コードを読む人間 (自分自身を含む) にとっては、レイアウト マネージャーが既定であっても、レイアウト マネージャーを指定する方が適切です。複雑な GUI では、2 つまたは 3 つの異なるレイアウト マネージャーを試して、必要な結果を得ることができます。

最後に、最後の 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();
        }

}
于 2013-02-25T16:38:10.667 に答える