In JPanel sofort zeichnen - klappt nur ab dem 2n mal :-(
Guten Abend!
Um Java zu ueben habe ich ein kleines Spielchen angefangen. Ein Problem daran laesst mich momentan verzweifeln. Es geht um TicTacToe Variante. Als
Spielflaeche zeichne ich 9 (3x3) Felder, die extends JPanel sind. Mit
drawLine und drawOval zeichne ich entsprechende Symbole drauf.
Leider wird der erste Mausklick nach dem Spielstart ignoriert. Ignoriert insofern, dass es nichts gezeichnet wird. Die Methode springt an, variablen werden gesetzt, in der Console werden richtige Werte angezeigt, nur gezeichnet wird nichts. Ab dem 2n Klick geht alles in Ordnung. Sitze fast 4 Stunden davor und bringe es momentan zu gar nichts
Wisst Ihr einen Rat?
Zugegeben, der Code ist etwas wirr. Habe mir nicht viele Gedanken gemacht als ich spontan anfing :-(
Guten Abend!
Um Java zu ueben habe ich ein kleines Spielchen angefangen. Ein Problem daran laesst mich momentan verzweifeln. Es geht um TicTacToe Variante. Als
Spielflaeche zeichne ich 9 (3x3) Felder, die extends JPanel sind. Mit
drawLine und drawOval zeichne ich entsprechende Symbole drauf.
Leider wird der erste Mausklick nach dem Spielstart ignoriert. Ignoriert insofern, dass es nichts gezeichnet wird. Die Methode springt an, variablen werden gesetzt, in der Console werden richtige Werte angezeigt, nur gezeichnet wird nichts. Ab dem 2n Klick geht alles in Ordnung. Sitze fast 4 Stunden davor und bringe es momentan zu gar nichts

Wisst Ihr einen Rat?
Code:
public class GameApp {
public static void main(String[] args) {
Window win = new Window();
win.setVisible(true);
}
}
Code:
package game.pak;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextField;
import javax.swing.JToolBar.Separator;
public class Window extends JFrame{
//window
private int width = 300;
private int height =300;
private Container panel;
//Menu
private JMenu menu;
private JMenuBar menubar;
private JMenuItem player_vs_player;
private JMenuItem player_vs_computer;
private JMenuItem exit_game;
//HUD (Head Up Display)
private JTextField info;
//Game
private Player player [] = new Player[2];
private Field field [][] = new Field[3][3];
private Player p_move;
private boolean game = false;
//**
public Window(){
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
this.setLayout(null);
this.setResizable(false);
this.setTitle("TicTacToe");
this.panel = getContentPane();
this.create_menu();
this.create_hud();
this.setBounds(dim.width/2-this.width/2,dim.height/2-this.height/2,this.width,this.height);
this.addWindowListener(new WindowListener(){
public void windowActivated(WindowEvent arg0) {
}
public void windowClosed(WindowEvent arg0) {
}
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
public void windowDeactivated(WindowEvent arg0) {
}
public void windowDeiconified(WindowEvent arg0) {
}
public void windowIconified(WindowEvent arg0) {
}
public void windowOpened(WindowEvent arg0) {
}
});
}//ende konstruktor
private void create_menu(){
this.menu = new JMenu("Game");
this.menubar = new JMenuBar();
this.player_vs_player = new JMenuItem("Player VS Player");
this.player_vs_computer = new JMenuItem("Player VS Computer");
this.exit_game = new JMenuItem("Exit game");
this.menu.add(this.player_vs_player);
this.player_vs_player.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
if(event.getModifiers()==16){
start_game("human");
}
}
});
this.menu.add(this.player_vs_computer);
this.player_vs_computer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
if(event.getModifiers()==16){
start_game("computer");
}
}
});
this.menu.addSeparator();
this.menu.add(this.exit_game);
this.exit_game.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
if(event.getModifiers()==16){
System.exit(0);
}
}
});
this.menubar.add(this.menu);
setJMenuBar(this.menubar);
}
private void create_hud(){
this.info = new JTextField("Select a opponent.");
this.info.setBounds(0,this.height-75,this.width,20);
this.info.setHorizontalAlignment((int)CENTER_ALIGNMENT);
this.info.setEditable(false);
this.add(info);
}
private void start_game(String who){
if(game==false){
restart();
char letter;
Random gen = new Random();
if(gen.nextBoolean()==true){
letter = 'x';
}else{
letter = 'o';
}
player[0] = new Player("human");
player[1] = new Player(who,letter);
if(who=="human"){
info.setText("Player(X) VS Player(0)");
}else{
info.setText("Player(X) VS Computer(0)");
}
for(int x=0;x<3;x++){
for(int y=0;y<3;y++){
field[x][y] = new Field(x*51+70,y*51+40,this);
this.panel.add(field[x][y]);
if(player[1].getLetter()=='x'){
p_move = player[1];
player[0].setLetter('o');
}else{
p_move = player[0];
player[0].setLetter('x');
player[1].setLetter('o');
}
}
}
}
game = true;
}
public Player getPlayer(){
return this.p_move;
}
public void setPlayer(){
if(player[0]==p_move){
p_move = player[1];
}else{
p_move = player[0];
}
if(p_move.getLetter()=='x'){
info.setText("Player (X)");
}else{
info.setText("Player (0)");
}
if(p_move.getWho()=="computer"){
Random gen = new Random();
int x = gen.nextInt(3);
int y = gen.nextInt(3);
while(field[x][y].getContent()!='-'){
x = gen.nextInt(3);
y = gen.nextInt(3);
}
field[x][y].addContent();
}
}
public void check_game(){
char temp = '-';
//vertikal pruefen:
for(int x=0;x<3;x++){
temp = field[x][0].getContent();
if(temp!='-'){
if(temp==field[x][1].getContent() && temp == field[x][2].getContent()){
game_over();
}
}
}
//horizontal pruefen:
for(int y=0;y<3;y++){
temp = field[0][y].getContent();
if(temp!='-'){
if(temp==field[1][y].getContent() && temp == field[2][y].getContent()){
game_over();
}
}
}
//diagonal pruefen:
temp = field[0][0].getContent();
if(temp!='-'){
if(temp==field[1][1].getContent()&&temp==field[2][2].getContent()){
game_over();
}
}
temp = field[2][0].getContent();
if(temp!='-'){
if(temp==field[1][1].getContent()&&temp==field[0][2].getContent()){
game_over();
}
}
//System.out.println(field[0][0].getContent()+" "+field[1][0].getContent()+" "+field[2][0].getContent()+" ");
//System.out.println(field[0][1].getContent()+" "+field[1][1].getContent()+" "+field[2][1].getContent()+" ");
//System.out.println(field[0][2].getContent()+" "+field[1][2].getContent()+" "+field[2][2].getContent()+" ");
//System.out.println("---");
}
public void game_over(){
if(p_move.getLetter()=='x'){
info.setText("Player (0) WIN!");
}else{
info.setText("Player (X) WIN!");
}
game=false;
}
public void restart(){
if(player[0]!=null){
for(int i=0;i<2;i++){
player[i]=null;
}
for(int x=0;x<3;x++){
for(int y=0;y<3;y++){
this.remove(field[x][y]);
field[x][y]=null;
}
}
p_move = null;
}
game=true;
}
public boolean getGame(){
return this.game;
}
}
Code:
package game.pak;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;
public class Field extends JPanel {
private char content;
private Window w;
private int x;
private int y;
// private Graphics g;
public Field(int x, int y, Window w) {
setX(x);
setY(y);
setContent('-');
setW(w);
this.setBounds(x, y, 50, 50);
this.setBackground(Color.BLACK);
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
if(getContent()=='-'){
addContent();
}
}
});
}
public void click(){
Graphics g = this.getGraphics();
g.setColor(Color.WHITE);
if(this.w.getGame()==true){
if(this.getContent()=='x'){
g.drawLine(10, 10, 40, 40);
g.drawLine(40, 10, 10, 40);
}else{
g.drawOval(10, 10, 30, 30);
}
}
}
public void redraw(){
Graphics a = this.getGraphics();
a.setColor(Color.WHITE);
if(this.w.getGame()==true){
if(this.getContent()=='x'){
a.drawLine(10, 10, 40, 40);
a.drawLine(40, 10, 10, 40);
}else{
a.drawOval(10, 10, 30, 30);
}
}
}
public void addContent(){
if(this.w.getPlayer().getLetter()=='x'){
setContent('x');
}else{
setContent('o');
}
click();
w.setPlayer();
w.check_game();
}
public char getContent() {
return content;
}
public void setContent(char content) {
this.content = content;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void setW(Window w){
this.w = w;
}
}
Code:
package game.pak;
public class Player {
private String who;
private char letter;
private int won;
public Player(String who){
setWho(who);
setWon(0);
}
public Player(String who,char letter){
setWho(who);
setWon(0);
setLetter(letter);
}
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
public char getLetter() {
return letter;
}
public void setLetter(char letter) {
this.letter = letter;
}
public int getWon() {
return won;
}
public void setWon(int won) {
this.won = won;
}
}
Zugegeben, der Code ist etwas wirr. Habe mir nicht viele Gedanken gemacht als ich spontan anfing :-(
Zuletzt bearbeitet: