2013-03-14 148 views
1

我正在使用框架顯示消息,但框架的內容不顯示。 以下是我的MessageBox框架的代碼。JFrame的內容未顯示

public class MessageBox extends javax.swing.JFrame { 

/** 
* Creates new form MessageBox 
*/ 
public static String title=null,message=null; 

public MessageBox(String message,String title) { 

    initComponents(); 



} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code"> 
private void initComponents() { 

    txtMessage = new javax.swing.JTextField(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    addWindowListener(new java.awt.event.WindowAdapter() { 
     public void windowOpened(java.awt.event.WindowEvent evt) { 
      formWindowOpened(evt); 
     } 
    }); 

    txtMessage.setBackground(new java.awt.Color(236, 233, 216)); 
    txtMessage.setOpaque(false); 
    txtMessage.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      txtMessageActionPerformed(evt); 
     } 
    }); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(18, 18, 18) 
      .addComponent(txtMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 380, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(31, 31, 31) 
      .addComponent(txtMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(24, Short.MAX_VALUE)) 
    ); 

    pack(); 
}// </editor-fold> 

private void txtMessageActionPerformed(java.awt.event.ActionEvent evt) { 
    // TODO add your handling code here: 
} 

private void formWindowOpened(java.awt.event.WindowEvent evt) { 
    // TODO add your handling code here: 
    this.setTitle(title); 
    txtMessage.setText(message); 
    txtMessage.revalidate(); 
    txtMessage.repaint(); 
    this.repaint(); 
} 

/** 
* @param args the command line arguments 
*/ 

// Variables declaration - do not modify 
private javax.swing.JTextField txtMessage; 
// End of variables declaration 

public static void main(String args[]) { 
    /* 
    * Set the Nimbus look and feel 
    */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* 
    * If Nimbus (introduced in Java SE 6) is not available, stay with the 
    * default look and feel. For details see 
    * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 

    //</editor-fold> 

    java.awt.EventQueue.invokeLater(new Runnable() { 

     public void run() { 
      // new ERPMainMenu().setVisible(true); 
      new MessageBox(title,message).setVisible(true); 
     } 
    }); 
} 

}

 public Class CallingClass 
    { 
     public CallingClass(){ 
    } 
public caller(){ 
     MessageBox mb =new MessageBox("The Data is saved successfully", "Success"); 

      mb.setLocation(400, 300); 
      mb.setVisible(true); 
     try { 
      Thread.sleep(5000); 
} catch(InterruptedException ex) { 
Thread.currentThread().interrupt(); 
} 
      mb.setVisible(false); 

    } 
    } 
+2

爲什麼不使用JOptionPane?它已經有顯示消息對話框的方法。 – 2013-03-14 08:44:36

+0

我想在用戶干擾5秒後消失消息框,並且JOptionPane不支持 – 2013-03-14 08:47:53

回答

3

使用javax.swing.Timer而不是在Thread.sleep()。你所有的代碼應該是這樣的:

MessageBox.java

import javax.swing.*; 
import java.awt.event.*; 
public class MessageBox extends javax.swing.JFrame 
{ 
    /** 
    * Creates new form MessageBox 
    */ 
    public static String title=null,message=null; 
    public MessageBox(String message,String title) 
    { 
     this.message = message; 
     this.title = title; 
     initComponents(); 
    } 
    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() 
    { 

     txtMessage = new javax.swing.JTextField(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     addWindowListener(new java.awt.event.WindowAdapter() 
     { 
      public void windowOpened(java.awt.event.WindowEvent evt) 
      { 
       formWindowOpened(evt); 
      } 
     }); 
     txtMessage.setBackground(new java.awt.Color(236, 233, 216)); 
     txtMessage.setOpaque(false); 
     txtMessage.addActionListener(new java.awt.event.ActionListener() 
     { 
      public void actionPerformed(java.awt.event.ActionEvent evt) 
      { 
       txtMessageActionPerformed(evt); 
      } 
     }); 
     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
     .addGap(18, 18, 18) 
     .addComponent(txtMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 380, javax.swing.GroupLayout.PREFERRED_SIZE) 
     .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
     .addGap(31, 31, 31) 
     .addComponent(txtMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE) 
     .addContainerGap(24, Short.MAX_VALUE)) 
     ); 
     pack(); 
    }// </editor-fold> 
    private void txtMessageActionPerformed(java.awt.event.ActionEvent evt) 
    { 
     // TODO add your handling code here: 
    } 
    private void formWindowOpened(java.awt.event.WindowEvent evt) 
    { 
     // TODO add your handling code here: 
     this.setTitle(title); 
     txtMessage.setText(message); 
     txtMessage.revalidate(); 
     txtMessage.repaint(); 
     this.repaint(); 
    } 
    /** 
    * @param args the command line arguments 
    */ 
    // Variables declaration - do not modify 
    private javax.swing.JTextField txtMessage; 
    // End of variables declaration 
    public static void main(String args[]) 
    { 
     /* 
     * Set the Nimbus look and feel 
     */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* 
     * If Nimbus (introduced in Java SE 6) is not available, stay with the 
     * default look and feel. For details see 
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 

     //</editor-fold> 
     java.awt.EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       CallingClass cl = new CallingClass(); 
       cl.caller(); 
      } 
     }); 
    } 
} 



CallingClass.java

class CallingClass 
{ 
    public CallingClass(){} 
    public void caller() 
    { 
     final MessageBox mb =new MessageBox("The Data is saved successfully", "Success"); 
     mb.setLocation(400, 300); 
     javax.swing.Timer timer = new javax.swing.Timer(5000,new ActionListener() 
     { 
      public void actionPerformed(ActionEvent evt) 
      { 
       mb.setVisible(false); 
      } 
     }); 
     timer.start(); 
     mb.setVisible(true); 
    } 
} 

注:正如Camic建議kr,我已經在顯示JFrame之前啓動了定時器。這增加了持續時間的準確度(在您的案例中爲5秒 ),直到JFrame可見。

+2

+1,但應在顯示窗口之前啓動Timer。這樣,代碼將用於JOptionPane或模式對話框,它應該用作彈出窗口而不是JFrame。 – camickr 2013-03-14 15:28:31

+0

@camickr:感謝您的寶貴建議... – 2013-03-14 16:46:24

+0

@Syed Muhammad Mubas:查看更新後的帖子.. – 2013-03-15 14:33:03