Я пытаюсь написать приложение, которое выглядит примерно так:
- Показать диалоговое окно
- Когда пользователь нажимает ОК, закрыть диалоговое окно, перейти к основному приложению
Вот соответствующиефрагменты кода:
public class Owari extends JPanel implements ActionListener, MouseListener, Runnable {
// FIELDS
JFrame frame;
JTextField IP;
String IPAddress;
static final int SERVER_MODE = 0;
static final int CLIENT_MODE = 1;
int mode;
OwariBoard board;
public static void main( String[] args ) {
SwingUtilities.invokeLater( new Owari() );
}
Owari() {
setPreferredSize( new Dimension( WIDTH, HEIGHT ) );
board = new OwariBoard();
}
void main() {
this.addMouseListener( this );
frame.dispose();
frame = new JFrame( "Owari" );
frame.setContentPane( this );
frame.pack();
frame.setVisible(true);
if ( mode == SERVER_MODE ) {
server();
}
if ( mode == CLIENT_MODE ) {
client();
}
}
public void run() {
frame = new JFrame( "Owari" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JPanel init = new JPanel( new GridBagLayout() );
frame.setContentPane( init );
add some components to the init panel including a button with
this as its actionListener and OK as its command.
frame.pack();
frame.setVisible( true );
}
public void actionPerformed( ActionEvent e ) {
if ( e.getActionCommand().equals( "Client" ) ) {
mode = CLIENT_MODE;
IP.setVisible( true );
}
else if ( e.getActionCommand().equals( "Server" ) ) {
mode = SERVER_MODE;
IP.setVisible( false );
}
else {
IPAddress = IP.getText();
main();
}
}
public void paintComponent( Graphics g ) {
super.paintComponent( g );
System.out.println( "painting" );
do some paintin
}
void server() {
frame.setTitle( "Owari Server" );
try {
server = new ServerSocket( 666 );
socket = server.accept();
initIO();
} catch ( IOException e ) {}
yourTurn = true;
System.out.println( "Got to end of server()" ); // At this point, the window
DOES get painted
Что происходит следующим образом:
В начальном диалоговом окне отображается:
Я нажимаю кнопку ОК.Главное окно изменяется до предпочтительного размера основного приложения, но оно не окрашивается, оно просто прозрачно (показано здесь с этой страницей в качестве фона, хе):
http://imgur.com/6Ssij.jpg
Iможет сказать, что метод paintComponent не был вызван, потому что «painting» не выводится на консоль.Тем не менее, "добрался до этой точки в программе" печатается, так что программа не зависает, она просто не вызывает paintComponent.Затем, когда я запускаю клиент и подключаюсь, приложение, наконец, раскрашивается, а «раскрашивание» и «получение клиента» выводятся на консоль.Также позже в приложении вызовы repaint () задерживаются (то есть, paintComponent фактически вызывается позже в программе, чем когда выполняется вызов repaint ()).
Я также попытался заменить исходное диалоговое окно, используяsthing вдоль линий
public void main
frame.getRootPane.removeAll()
frame.setContentPane(this)
frame.getRootPane().revalidate()
frame.pack()
Точно такой же результат.
tl; dr paintcomponent не вызывается, когда я этого хочу, что делать?
Получение дополнительной информации: вызов repaint () выполняется до вызова sever.accept (). Так почему же он не перерисовывается () до зависания при вызове server.accept ()?