2015-05-31 2 views
0

Я пытаюсь сделать игру Connect Four, чтобы улучшить свои способности с помощью Java Graphics и школьного проекта. Фон для игры будет синим JPanel, а игровым полем будет отдельный JPanel, который будет помещен поверх фона. Смотрите мои классы ниже:Weird output для графического кода

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JPanel; 


public class gameBoard extends JPanel { 

private Board bored; 

public gameBoard(){ 
    setLayout(new BorderLayout()); 

    bored = new Board();//does not appear in Center Region of gameBoard  
    add(bored, BorderLayout.CENTER); 

    } 

public void paint(Graphics g){//This line is the one that is acting weird. 
    //blue rectangle board is here, but when repaint called 
    //JFrame turns blue and does not add new JPanel called above 
    g.setColor(Color.BLUE); 
    g.fillRect(0, 0, 1456, 916); 
    } 

} 

И

import java.awt.BasicStroke; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Color; 
import java.awt.Graphics2D; 
import javax.swing.JPanel; 

public class Board extends JPanel { 

/* 
* 2d array will represent board and take 1's(red) and 2's(black) the nums 
* represent pieces, with each redraw of the board, a check will be done to 
* compare a sum against blackWin and redWin. Sum will be created by 
* summing a continuous line of 1's or 2's going left -> right 
*/ 
public int[][] boardEvalMatrix = new int[6][7]; 
private final int blackWin = 8, redWin = 4; 


public Board() {//1200 x 764 
    BoardMethods a = new BoardMethods(); 
    a.printBoard(getBoard()); 
    JPanel panelLORDY = new JPanel(new FlowLayout()); 
    repaint(); 
    } 

public int[][] getBoard(){ 
    return boardEvalMatrix; 
    } 
public void paint(Graphics g){ 
    g.setColor(Color.BLUE);//Drawing background with actual board as a Test 
    g.fillRect(0, 0, 1456, 916);//will not remain like this 
    Graphics2D newG = (Graphics2D) g; 
    newG.setStroke(new BasicStroke(15)); 
    g.setColor(Color.YELLOW); 
    for(int a = 0; a < 6; a++)//rows for board --- rowHeight is 127 
     g.drawRect(128, 68+ (a*127), 1200, 127); 
    //g.setColor(Color.BLACK); 
    //newG.setStroke(new BasicStroke(8)); 
    //for(int a = 0; a < 7; a++)//columns for board --- columnWidth is 171 
    // g.drawRect(208, 152, 70, 10); 


    //g.drawLine(50,0, 1456, 916); //width 1456 length 916 - school computer monitors 
    } 
} 

Так что случилось это:

ПРОБЛЕМА 1:

Когда я включаю public void paint(Graphics g) линию в gameBoard класс, отображение, которое появляется при запуске драйвера, просто серое JFrame, хотя звонок на номер repaint() и метод paint() пуст. Однако, когда я удалил строку, создав метод paint, проблема исчезла, и появился соответствующий экран.

ПРОБЛЕМА 2:

Даже когда я разместил код, чтобы нарисовать синий прямоугольник в методе paintgameBoard в классе и называется repaint()JFrame был голубой цвет, который отчасти прав. Я знаю, что Java выполняет команды сверху вниз, поэтому я убедился, что код, добавляющий фактическую доску игры в gameBoardJPanel, появился после рисования синего прямоугольника, но он не работал.

ВОПРОС:

Что я сделал не так и как это исправить?

ответ

1

Чтобы изменить цвет фона панели вы просто использовать:

setBackground(Color.BLUE); 

на панели. Тогда нет необходимости в индивидуальной покраске.

Когда вы переопределяете paint() и забудете super.paint(), вы действительно испортите процесс рисования. Метод paint() отвечает за покраску дочерних компонентов на панели. Поскольку вы не вызываете super.paint(), дети никогда не окрашиваются.

Если вам по какой-то причине нужна обычная роспись, вы должны переопределить метод paintComponent() и не забудьте вызвать super.paintComponent(). Не переопределяйте paint().

Прочтите учебник Swing по теме «Custom Painting», особенно раздел на A Closer Look at the Paint Mechanism для получения дополнительной информации и примеров.

+0

Так что просто быстрое разъяснение, в любое время, когда я использую 'paintComponent()' или 'paint()' Мне нужно называть их соответствующие supers? – Ungeheuer

+0

Кстати, 'setBackground (Color.BLUE);' did not work. Рамка по-прежнему серая даже с этой строкой – Ungeheuer

+0

@JohnnyCoder, создайте рамку, добавьте JPanel к кадру и установите цвет фона в СИНИЙ. Для этого потребуется около 5-10 строк кода. В вашем примере вы используете BorderLayout, а затем добавляете панель Board на панель GameBoard. Таким образом, вы видите серый цвет BoardPanel. Установите BoardPanel в СИНИЙ. Вопрос в том, почему вы используете две панели?'Не переопределять paint() !!!', только переопределять 'paintComponent()'. – camickr