gpt4 book ai didi

java - PaintComponent 没有在正确的时间被调用

转载 作者:行者123 更新时间:2023-12-02 08:26:22 26 4
gpt4 key购买 nike

我正在尝试编写一个类似这样的应用程序:
- 显示对话框
- 当用户单击“确定”时,关闭对话框,转到主应用程序

以下是相关代码片段:

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

发生的情况如下:
初始对话框显示:
我单击“确定”按钮。主窗口的大小调整为主应用程序的首选大小,但它不会被绘制,它只是透明的(此处显示此页面作为背景,呵呵):
/image/8HIWo.jpg

我可以看出,paintComponent 方法尚未被调用,因为“绘画”未打印到控制台。然而,“在程序中到达这一点”确实被打印出来,所以程序没有挂起,它只是没有调用paintComponent。然后,当我启动客户端并连接时,应用程序最终被绘制,并且“绘制”和“获得客户端”被打印到控制台。此外,稍后在应用程序中,对 repaint() 的调用也会被延迟(即,paintComponent 实际上在程序中比调用 repaint() 更晚被调用)。

我还尝试使用类似的东西替换初始对话框

public void main
frame.getRootPane.removeAll()
frame.setContentPane(this)
frame.getRootPane().revalidate()
frame.pack()

完全相同的结果。

tl;当我想要它时,dr PaintComponent 没有被调用,该怎么办?

<小时/>

碰撞更多信息:对 repaint() 的调用是在调用 sever.accept() 之前完成的那么为什么它不将 repaint() before 卡在 server.accept() 处打电话?

最佳答案

openasocketandwaitforaclient

您的代码正在事件调度线程中执行,因此阻塞套接字会阻止 GUI 重新绘制自身。

您需要为套接字使用单独的线程。阅读 Swing 教程中关于 Concurrency 的部分寻求解释和解决方案。

关于java - PaintComponent 没有在正确的时间被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com