paintComponent не вызывается в нужное время - PullRequest
0 голосов
/ 14 декабря 2010

Я пытаюсь написать приложение, которое выглядит примерно так:
- Показать диалоговое окно
- Когда пользователь нажимает ОК, закрыть диалоговое окно, перейти к основному приложению

Вот соответствующиефрагменты кода:

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 ()?

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

openasocketandwaitforaclient

Ваш код выполняется в потоке диспетчеризации событий, поэтому блокирующий сокет не позволяет графическому интерфейсу перерисовывать себя.

Вам необходимо использовать отдельный потокдля розетки.Прочитайте раздел из учебника по Swing по Concurrency для объяснения и решения.

0 голосов
/ 14 декабря 2010

Ваш код, кажется, работает так, возможно, вам следует попытаться вызвать метод repaint () вашего фрейма после изменения размера этого фрейма.

Anhuin

...