|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
[Java] Problema applet con aggiornamento grafica
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 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
|
le eccezioni di readobject le gestisci ?
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
|
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Quote:
|
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Quote:
Codice:
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); }*/ } Codice:
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(); } } Ultima modifica di UnknownSoldier : 12-04-2010 alle 17:04. |
|
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
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?
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:54.