Domanda Aiuto interfaccia grafica

Stato
Discussione chiusa ad ulteriori risposte.

TheAxer

Utente Bronze
26 Giugno 2015
5
2
0
34
Ciao ragazzi, io e un mio compagno stiamo lavorando a un progetto d'esame per programmazione che consiste nel creare un giocatore di Forza4, implementando anche un'interfaccia grafica. Purtroppo siamo entrambi degli scarsi gnudi e quando creiamo la finestra non riusciamo a visualizzare niente. Dobbiamo riuscire a tracciare una griglia (quella classica di F4). Inoltre ci è venuto il dubbio: il metodo repaint() evoca effettivamente paintComponent? perchè a noi sembra che fallisca di brutto D: In spoiler c'è il codice del poco che abbiamo fatto fin'ora

Codice:
public class finestra extends JPanel{
        JPanel h;
        int nc;
        int nr;
        JFrame p;

        public finestra(int r, int c){
            nc=c;
            nr=r;
            JPanel h= new JPanel();
            JFrame p= new JFrame ("Connect 4");
            p.setDefaultCloseOperation(EXIT_ON_CLOSE);
            p.setSize(100*c, 100*r);
            p.add(h);
            h.setLayout(new GridLayout(r,c,5,5));
            h.addMouseListener(new ActionHandler());
            p.setVisible(true);
            repaint();
        }
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.setColor(Color.BLACK);
            for (int i =0;i<nc;i++){
                g.fillRect(100*i, 0, 100*i, nr*100);
            }
        }
        public void aggiorna(int mossa){
            repaint();
        }
    }
 
Ci sono altre classi? Avete esteso una classe JPanel (che in parte va bene) ma per visualizzare qualcosa vi occorre necessariamente un JFrame su cui poi dovrete inserire il JPanel "finestra".
 
Allora abbiamo leggermente fixato la faccenda (ci dava errori strani) ma ancora non vediamo niente. Quindi mi dici che devo necessariamente creare una classe JFrame e quindi non basta dichiarare un oggetto di quel tipo? Preciso una cosa che non mi pare di aver scritto prima: la finestra effettivamente si apre, solo che non riusciamo a disegnare questa benedetta griglia...
Questo comunque è tutto il codice che abbiamo per ora:
(Se noti, dentro al metodo start, noi istanziamo un JFrame..)

Codice:
package player;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;

import gj.forza4.player.AbstractHumanPlayer;

import javax.swing.*;

public class HumanPlayer extends AbstractHumanPlayer{
JPanel h;
int nc;
int nr;
JFrame p;
public void start(int r, int c) {
  nc=c;
  nr=r;
  JPanel h= new JPanel();
  JFrame p= new JFrame ("Connect 4");
  p.setDefaultCloseOperation(EXIT_ON_CLOSE);
  p.setSize(100*c, 100*r);
  p.add(h);
  h.setLayout(new GridLayout(r,c,5,5));
  h.addMouseListener(new ActionHandler());
  repaint();
  p.setVisible(true);
}

public void tellMove(int m) {
  
}

protected void humanPlayerMove(int mossa) {
  
}
public void paint(Graphics g){
  g.setColor(Color.BLACK);
  g.fillOval(23, 23, 23, 23);

}
public class ActionHandler implements MouseListener {

  public void mouseClicked(MouseEvent click) {
  setMove(click.getX()/100);
  }

  public void mouseEntered(MouseEvent arg0) {
  
  }


  public void mouseExited(MouseEvent arg0) {
  // TODO Auto-generated method stub

  }


  public void mousePressed(MouseEvent arg0) {
  // TODO Auto-generated method stub

  }


  public void mouseReleased(MouseEvent arg0) {
  // TODO Auto-generated method stub

  }

}  

}
 
Se mi posso permettere direi che il vostro approccio sul programma è un tantino sbagliato. Essendo un giocatore di forza 4 (che si presume dovrebbe avere un minimo di intelligenza) l'intero software deve avere una struttura diversa e ben più complessa, mi spiego. Io affronterei il problema utilizzando almeno 3 classi separate (mantenendo scalabilità e modularità):

FRAME<--->GRAPHICS<--->CORE

FRAME si occupa appunto di creare l'interfaccia, avviarla e gestirla. GRAPHICS si occuperà della creazione della struttura del gioco (le righe, l'inserimento delle messe X e O memorizzando, magari in una matrice, dove sono state inserite le mosse) mentre il CORE si occuperà di tutta la parte "gioco" ovvero capire dove l'utente ha posizionato la sua scelta e decidere qual'è la prossima mossa per poter vincere. Dividere i compiti in più classi permette di rendere più veloce e snello il codice oltre che poter individuare meglio eventuali problemi (se si usano gli strumenti di debug step by step) e risolverli senza intaccare tutto il resto del software.
 
Hmm forse non mi sono spiegato abbastanza chiaramente:
Il progetto di per sè è già "fatto", ovvero c'è già chi si occupa di avviare il gioco, chi di gestirlo ecc. Il nostro problema è proprio riuscire a capire COME disegnare "roba" su una finestra dal momento che, nonostante noi si sia provato a inserirci componenti (vedi codice) rimane comunque una finestra grigia :omfg:
 
Hmm forse non mi sono spiegato abbastanza chiaramente:
Il progetto di per sè è già "fatto", ovvero c'è già chi si occupa di avviare il gioco, chi di gestirlo ecc. Il nostro problema è proprio riuscire a capire COME disegnare "roba" su una finestra dal momento che, nonostante noi si sia provato a inserirci componenti (vedi codice) rimane comunque una finestra grigia :omfg:

ridefinendo paint , metodo definito nella classe Window , eseguite un disegno sul frame e non sul jpanel(che occupa tutto lo spazio). Quindi ecco perché vedete tutto grigio.
 
  • Mi piace
Reazioni: TheAxer
ridefinendo paint , metodo definito nella classe Window , eseguite un disegno sul frame e non sul jpanel(che occupa tutto lo spazio). Quindi ecco perché vedete tutto grigio.
In realtà abbiamo risolto ora e il problema era proprio quello effettivamente ^^ Grazie mille per la risposta comunque! :)
 
Stato
Discussione chiusa ad ulteriori risposte.