我正在尝试编写类似这样的应用:
- 显示对话框
- 当用户单击“确定”时,关闭对话框,转到主应用程序
以下是相关的代码段:
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
以下是:
初始对话框显示:
我单击“确定”按钮。
主窗口的大小调整为主应用程序的首选大小,但它不会被绘制,它只是透明的(此处显示为此页面为背景,heh):
http://imgur.com/6Ssij.jpg
我可以告诉paintComponent方法没有被调用,因为“绘画”没有打印到控制台。 但是,“在程序中达到了这一点”是打印出来的,所以程序没有挂起,它只是没有调用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()之前没有重绘()调用
答案 0 :(得分:2)
openasocketandwaitforaclient
您的代码在事件调度线程中执行,因此阻塞套接字阻止GUI重新绘制自己。
你需要为套接字使用单独的Thread。阅读Concurrency上的Swing教程中的部分,以获得解释和解决方案。
答案 1 :(得分:0)
您的代码似乎正常工作,也许您应该在调整此框架大小后尝试调用框架的repaint()方法。
Anhuin