2016-12-23 9 views
1

スレッドが機能しないのはなぜですか?なぜ私のスレッドが機能していないのですか?

JFrameにメッセージを短時間表示したいです。メッセージを閉じてメインJPanelを開始します。

メインクラスの外にスレッドを配置する必要がありますか?

Googleで詳細を検索しましたが、私は絶望的です。

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

import javax.swing.*; 

public class SwitchCheck { 

    public static void main(String[] args) { 

     final JFrame JF = new JFrame("SwitchJpanel"); 
     JF.setSize(300, 200); 
     JF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Thread Cl = new Thread() { 
      public void run() { 
       try { 
        JPanel P = new JPanel(null); 
        JF.getContentPane().add(P); 
        JButton L = new JButton("Wellcome"); 
        L.setBounds(20, 30, 100, 20); 
        P.add(L); 
        sleep(10000000); 
       } catch (Exception e) { 

       } 
      } 
     }; 
     Cl.start(); 
     JF.getContentPane().removeAll(); 
     JF.getContentPane().revalidate(); 
     final JPanel P1 = new JPanel(null); 
     JF.getContentPane().add(P1); 
     JLabel L1 = new JLabel("Left"); 
     L1.setBounds(10, 20, 100, 20); 
     P1.add(L1); 
     JLabel L2 = new JLabel("Right"); 
     L2.setBounds(120, 20, 100, 20); 
     P1.add(L2); 
     final JButton B1 = new JButton("Panel1"); 
     B1.setBounds(20, 60, 100, 20); 
     P1.add(B1); 
     final JButton B2 = new JButton("Panel2"); 
     B2.setBounds(120, 60, 100, 20); 
     P1.add(B2); 
     B1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       // TODO Auto-generated method stub 
       JF.getContentPane().removeAll(); 
       JPanel P1 = new JPanel(null); 
       JF.getContentPane().add(P1); 
       JF.getContentPane().revalidate(); 
       JLabel L1 = new JLabel("Left"); 
       L1.setBounds(10, 20, 100, 20); 
       P1.add(L1); 
       JLabel L2 = new JLabel("Right"); 
       L2.setBounds(120, 20, 100, 20); 
       P1.add(L2); 
       B1.setText("Panel1"); 
       B1.setBounds(20, 60, 100, 20); 
       P1.add(B1); 
       B2.setText("Panel2"); 
       B2.setBounds(120, 60, 100, 20); 
       P1.add(B2); 
      } 

     }); 
     B2.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       // TODO Auto-generated method stub 
       JF.getContentPane().removeAll(); 
       JPanel P2 = new JPanel(null); 
       JF.getContentPane().add(P2); 
       JF.getContentPane().revalidate(); 

       JLabel L3 = new JLabel("UP"); 
       L3.setBounds(10, 20, 100, 20); 
       P2.add(L3); 
       JLabel L4 = new JLabel("Down"); 
       L4.setBounds(120, 20, 100, 20); 
       P2.add(L4); 
       B1.setText("Panel3"); 
       B1.setBounds(20, 60, 100, 20); 
       P2.add(B1); 
       B2.setText("Panel4"); 
       B2.setBounds(120, 60, 100, 20); 
       P2.add(B2); 

      } 

     }); 
     JF.setResizable(false); 
     JF.setVisible(true); 
    } 

} 

答えて

4

あなたはあなたのコード内で複数のエラーがあります:あなたはmain方法ですべてのコードを実行している

  1. を。

  2. これは複雑なGUIを作るために最善かつ最も簡単な方法のように思えるかもしれないがあなたは、あなたが手動ですべてのコンポーネントの境界を設定している変数名はlowerCamelCase

  3. あるべきOracle naming conventionsをフォローしていませんスイングを学ぶことから始めて、これは正しい方法ではなく、Layout managerまたはそれらの組み合わせを使用し、スペーシングに必要な場合はEmpty bordersを使用します。スイングは複数の画面サイズ、PLAFおよび解像度で動作する必要があります。

  4. JFrameで短時間メッセージを表示したいのですが、メッセージを閉じてメインJPanelを開始したいと思います。それはあなたが何をしたいかのように思える

    は、いくつかの時間は、上記の点から

  5. を通過した後、あなたはThreadしかしSwing Timer使用したくないauto closeDialogを使用しています。

    Thread.sleep(...)は、プログラムが終了するまで "フリーズ"し、Timerは独自のスレッドで実行します。あなたがEvent Dispatch Thread (EDT)

+0

でプログラムを置いていない

  • はありがとう..私はスイングタイマーについて知らなかった..私は今、それを使用し、すごい:)作品 –

  • 関連する問題