2016-06-11 18 views
1

私の簡単なログインウィンドウでは、ログインボタンにアクションリスナーを追加しました。ボタンを押すと、プログラムはユーザーが入力した情報をチェックし、間違った情報を3回入力すると、プログラムがシャットダウンした後にユーザーに通知する新しいJDialogを作成します。Java SwingでSystem.exit()の前に情報JDialogを表示するにはどうすればよいですか? (クローズ)

私の問題は、JDialogが空白になってプログラムがシャットダウンすることです。ここで

は私のコードは

btnLogIn.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent actionEvent) { 
      char[] pass = pssPassWord.getPassword(); 
      String pss = new String(pass); 

      if (!pss.toString().equals("admin") || !txtUserName.getText().equals("Adminuser")){ 
       if (attempts == 2){ 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          new Inform("You entered the wrong info 3 times, the program will shut down"); 
          try { 
           Thread.sleep(1000); 
           System.exit(0); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 



       }else { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          new Info("Wrong info, please check the info"); 
         } 
        }); 
        attempts += 1; 
       } 
      }else{ 

      } 
     } 
    }); 

ですこれは私のクラスに通知されます。

public class Inform extends JDialog{ 

private JPanel pnlInform; 
private JLabel lblInform; 
private JButton btnOK; 

public Inform(String info){ 
    setContentPane(pnlInform); 
    lblInform.setText(info); 
    pack(); 
    setVisible(true); 
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    setLocationRelativeTo(null); 
    btnOK.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent actionEvent) { 
      dispose(); 
     } 
    }); 
} 

}

私のIDEはのIntelliJ IDEAであり、私はGUIを作成するために、フォームクラスを使用し、そうあり要素の宣言はありません。 pnlInformが構築され、resolvs nullにし、それがcontentPane cannot be set to null.
ソリューションを介しますされていないので、あなたがInformダイアログに任意のコンポーネントを追加didntの

+0

すぐに終了しますか?それでは、 'Info'に表示する時間を与える必要があるかもしれません。 –

+0

なぜ 'actionPerformed()'の 'invokeLater()'ですか?あなたはすでにEDTで走っていませんか? –

+0

@KevinWallis Thread.sleep(1000)を使用したので、1秒後に終了します。その前に、Info JDialogは表示されますが空白です。 –

答えて

0

:ダイアログに追加し、その後、(pnlInform、lblInform、btnOK)コンポーネントを構築。下には、フル機能のコードを見つけることができます。

package test.q5; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Inform extends JDialog { 

    private JPanel pnlInform=new JPanel(); 
    private JLabel lblInform=new JLabel(); 
    private JButton btnOK=new JButton("OK"); 

    public Inform(String info) { 
//  setContentPane(pnlInform); 
     add(pnlInform); 
     lblInform.setText(info); 
     pnlInform.add(lblInform); 
     pnlInform.add(btnOK); 

     pack(); 
     setVisible(true); 
     setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     setLocationRelativeTo(null); 
     btnOK.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent actionEvent) { 
       dispose(); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     new Inform("Hello"); 
    } 
} 

をしかし、あなたはまだメッセージのためにいくつかの書式設定を行う必要があり、助けることができるように別の質問として追加すること自由に感じなさい。

+0

私はあなたがこれを多く手助けすることをとてもうれしく思います。これはStackOverFlowに関する私の最初の質問ですので、私はまだ何かに慣れていません。私は時間の量の後にそれを終了させるために私のコードの使用タイマを変更しました。とにかく私はあなたの助けに感謝します。たぶん私はこの質問を閉じるべきであろう。もう一度ありがとう。 –

+0

あなたは大歓迎です! –

関連する問題