2016-06-20 33 views
0

JTabbedPaneタブのそれぞれにAppletJFrameを作成することです。メソッドloadPanel()Boxコンポーネント(Appletがロードされている間に表示されることになっていたと思われる「読み込み画面」)を返しますが、loadGame()メソッドはAppletをロードして返します。予想されたときにスイングコンポーネントが表示されない

load()が呼び出された場合、JTabbedPaneは、Appletがロードされるまで表示されません。私の脳を痛めつけて、何が間違っているのかわからない。メソッドの最後に

import java.awt.Color; 

import javax.swing.JFrame; 
import javax.swing.JTabbedPane; 

@SuppressWarnings("serial") 
public class Loaders extends JFrame { 

    int dimension; 
    int osClients; 
    int rs3Clients; 

    public Loaders(int osClients, int rs3Clients) { 
     this.osClients = osClients; 
     this.rs3Clients = rs3Clients; 
     this.dimension = (int) Math.sqrt(osClients + rs3Clients); 
    } 

    public void load() { 

     Loader[] os = new Loader[osClients]; 
     Loader[] rs3 = new Loader[rs3Clients]; 

     setTitle("DENCH CLIENTS"); 
     setSize(768, 528); 
     setResizable(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setBackground(new Color(0x2B2B2B)); 
     JTabbedPane tabs = new JTabbedPane(); 

     for(int i = 0; i < osClients; i++) { 
      os[i] = new Loader(Game.OSRS, i+1); 
      tabs.add("OS " + i, os[i].loadPanel()); 
     } 

     for(int i = 0; i < rs3Clients; i++) { 
      rs3[i] = new Loader(Game.RS3, i+1); 
      tabs.add("RS3 " + i, rs3[i].loadPanel()); 
     } 
     add(tabs); 
     tabs.setVisible(true); 
     setVisible(true); 

     for(Loader l : os) { 
      System.out.println(l.getWorld()); 
      int index = tabs.indexOfTabComponent(l.getBox()); 
      tabs.setComponentAt(index, l.loadGame()); 
     } 

     for(Loader l : rs3) { 
      int index = tabs.indexOfTabComponent(l.getBox()); 
      tabs.setComponentAt(index, l.loadGame()); 
     } 
    } 
} 
+3

フレームが表示される前にコンポーネントをフレームに追加する必要があります。 – camickr

+0

@camickrええと彼らは...? –

+0

すぐに役立つように、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 * "彼らは... ..." *いくつかは、他の人はそうではなかった。 @camickrが意味していたのは、フレームを表示する前にコンポーネントを追加する必要があります。 set visibleを呼び出す直前に、 'pack()'を呼び出します。 –

答えて

0
  • 移動setVisible
  • あなたは、タブパネルを更新しているので、このように、スイングディスパッチスレッドで呼ばれるように差し出されtab.setVisible(true) の必要はありません:

    SwingUtilities.invokeLater(new Runnable(){ 
        @Override 
        public void run() { 
         for(Loader l : os) { 
          System.out.println(l.getWorld()); 
          int index = tabs.indexOfTabComponent(l.getBox()); 
          tabs.setComponentAt(index, l.loadGame()); 
         } 
    
         for(Loader l : rs3) { 
          int index = tabs.indexOfTabComponent(l.getBox()); 
          tabs.setComponentAt(index, l.loadGame()); 
         } 
        }       
    }); 
    tabs.setVisible(true); 
    setVisible(true); 
    } 
    
関連する問題