就像标题所说,我的java屏幕一直空白。我希望它显示类形状和两个标签。如果你想看到另一个处理绘图线和xs的类,请告诉我。这就是我到目前为止所做的:
--- --- EDIT
既然你会给我建议,我已经取得了一些进展。我从Shapes的paint方法中删除了一些不错的代码,并将其移动到另一个方法或新类中以保持其清洁。形状仍然是由页面空白,但事情看起来更好。另外,请不要粘贴代码以获得答案。作为一名学生,我被指示不要复制代码。诸如“为循环创建3并创建整数”之类的方向被认为是可接受的。再次感谢你!每个人都非常乐于助人!
--- --- EDIT 在与老师交谈之后,我成功地分离了Shapes的图形组件并将它们放入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
答案 0 :(得分:1)
我做了一些更改,以确保您不会出现黑屏问题。
我注释掉了Shape系列,所以我可以运行测试。
首先,我添加了对SwingUtilities的调用,以便创建Swing组件并在Event Dispatch Thread上运行。这要求我将Swing代码放在Project1类中,让main方法执行SwingUtilities调用。我有类实现Runnable,因为这是SwingUtilities方法调用所需要的。
其次,我添加了一个主要的JPanel。最好将Swing组件添加到JPanel,并将JPanel添加到JFrame。添加其他组件时,您将获得更大的灵活性。
由于JPanel的默认布局管理器是FLowLayout,我不得不将布局管理器添加到JPanel构造函数中。通常,对于代码的人类读者(包括您自己)来说,指定布局管理器会更好,即使它是默认的。使用复杂的GUI,您可以尝试使用两到三个不同的布局管理器来获得所需的结果。
最后,我注释掉了最后一个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();
}
}