PDA

View Full Version : [Java] Problema applet con aggiornamento grafica


UnknownSoldier
11-04-2010, 16:42
Salve a tutti. Ho un problema con un mio programma:

Questo programma permette di collegare due applicazioni tra di loro per poter giocare a scacchi.
Tutto funziona alla perfezione quando utilizzo i JFrame. Quando invece adatto il codice per poterlo utilizzare come applet, qui iniziano il problemi.

Allora, avvio le due applicazioni (una che fa da server e una che fa da client) e le collego tra di loro attraverso i Socket. Nel metodo init() della JApplet carico tutti i componenti grafici e le connessioni, e sempre nello stesso metodo, alla fine, metto in ascolto le due applicazioni con il metodo readObject di ObjectInputStream.

Alla fine, il risultato è che non viene mostrato nulla nelle pagine web! Ho provato a mettere vari System.out.println per vedere dov'è l'inceppo, e ho scoperto che l'esecuzione delle due applicazioni viene interrotta quando incontra proprio la riga di codice in cui viene chiamato il metodo readObject di ObjectInputStream.

Ho quindi provato ad utilizzare questo metodo in un nuovo thread, ma il risultato è che l'applet viene disegnata male e/o non riconosce gli eventi del mouse (o forse semplicemente non ridisegna l'area grafica).

Ho provato anche ad usare readObject nei metodi start() e paint(), ma con lo stesso risultato.

Insomma, in che modo posso caricare tranquillamente tutta la grafica e poi chiamare readObject senza che succeda qualcosa di anomalo??

Può anche darsi che sia il ciclo do-while che contiene la chiamata a readObject... anzi forse è quasi sicuramente quello che blocca il programma! Ma come faccio a risolvere se neanche la creazione di un nuovo thread mi aiuta?

Ringrazio davvero tanto chi avrà voglia di aiutarmi

lupoxxx87
11-04-2010, 16:47
le eccezioni di readobject le gestisci ?

PGI-Bis
11-04-2010, 17:19
Tieni presente che un'applet è soggetta a restrizioni di sicurezza. Se non firmi digitalmente i jar che richiede alcune operazioni (tra cui l'apertura di socket) potrebbero rilasciare delle eccezioni che in un'applicazione desktop normalmente non si verificano.

Se apri la console java dopo aver lanciato le applet e vedi una traccia molto lunga che da qualche parte riporta "SecurityException" sei di fronte a questo caso.

UnknownSoldier
11-04-2010, 17:40
le eccezioni di readobject le gestisci ?

Le gestisco ma non viene lanciata alcuna eccezione. E' come se l'area grafica si bloccasse! E penso proprio che il problema sia il ciclo do-while che non so proprio come risolvere...

UnknownSoldier
11-04-2010, 17:41
Tieni presente che un'applet è soggetta a restrizioni di sicurezza. Se non firmi digitalmente i jar che richiede alcune operazioni (tra cui l'apertura di socket) potrebbero rilasciare delle eccezioni che in un'applicazione desktop normalmente non si verificano.

Se apri la console java dopo aver lanciato le applet e vedi una traccia molto lunga che da qualche parte riporta "SecurityException" sei di fronte a questo caso.

L'applet è firmata, quindi non posso andare incontro ad alcuna limitazione del genere.

banryu79
12-04-2010, 14:05
L'applet è firmata, quindi non posso andare incontro ad alcuna limitazione del genere.
UnknownSoldier, come sempre, posta (se puoi/vuoi) lo spezzone di codice dell'area incriminata, magari a qualcuno casca l'occhio su qualcosa :)

UnknownSoldier
12-04-2010, 16:52
UnknownSoldier, come sempre, posta (se puoi/vuoi) lo spezzone di codice dell'area incriminata, magari a qualcuno casca l'occhio su qualcosa :)

Posto le parti più importanti:


import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JApplet;
import java.awt.FlowLayout;
import java.awt.CardLayout;
import Chessboard.*;

public class ChessApplet extends JApplet
{
public void init()
{
setLayout (new FlowLayout());

int type = 1;
String host = "";

Connection connection = null;
if (type == 2)
connection = new Connection (Connection.CLIENT, this.getParameter("ip"));
else
connection = new Connection (Connection.SERVER);

JPanel rightPanel = new JPanel (new CardLayout());
Chat chat = new Chat (connection);
rightPanel.add (chat, "chat");

InformationPanel informationPanel = new InformationPanel();
Chessboard chessboard = new Chessboard (type, connection, chat, informationPanel, new JFrame());
GameEven gameEven = new GameEven (chessboard);
GameOver gameOver = new GameOver (chessboard);
rightPanel.add (gameEven, "even");
rightPanel.add (gameOver, "over");
chat.setChessboard(chessboard);
informationPanel.setChessboard(chessboard);
add (informationPanel);
add (chessboard);
add (rightPanel);

chessboard.movementsListener();
}

/*public static void main (String[] args)
{
new Chess (1);
}*/
}


movementsListener() (il metodo processConnection() contiene la chiamata a readObject di ObjectInputStream):

public void movementsListener()
{
String message = "";

try
{
do
{
try
{
message = connection.processConnection();
readMessageReceived (message);
}
catch (ClassNotFoundException classNotFoundException)
{
classNotFoundException.printStackTrace();
}
} while (!message.equals ("STOP"));
}
catch (EOFException eofException)
{
System.out.println ("\nCONNECTION TERMINATED");
}
catch (IOException ioException)
{
ioException.printStackTrace();
}
finally
{
connection.closeConnection();
}
}

UnknownSoldier
13-04-2010, 16:27
Ho pensato ad una cosa: e se forzassi la chiamata di paint() per disegnare tutto quello che c'è da disegnare prima di chiamare il metodo movementsListener() ? E' possibile?