2016-06-20 6 views
0

아래 클래스의 목표는 JTabbedPane 탭 각각에 AppletJFrame을 생성하는 것입니다. 메서드가로드되는 동안 Applet 메서드가 표시되는 반면, 메서드가로드되고 반환하는 메서드는 loadPanel()Box 구성 요소 (결과적으로 "로드중인 화면")를 반환합니다. load()를 호출하지만 예상 한 스윙 구성 요소가 표시되지 않음

JFrame 표시하지만 JTabbedPaneApplet로드 끝날 때까지 표시되지 않습니다. 내 머리를 건드리지 않고 무엇이 틀렸는 지 확신하지 못했다. 이 방법의 끝

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] 또는 [Short, Self Contained, Correct Example] (http://www.sscce.org/)를 게시하십시오. * "음 ... 그들은 ...?"어떤 것은 그렇지, 다른 것은 그렇지 않았습니다. @camickr의 의미는 *** 프레임을 표시하기 전에 구성 요소를 모두 추가해야한다는 것입니다. 그리고 set visible을 호출하기 직전에'pack()'을 호출하십시오. –

답변

0
  • 이동 setVisible
  • 사용자가 탭 패널을 업데이트하기 때문에,이 같은 스윙 파견 스레드에서 호출 할 proffered되고 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); 
    } 
    
관련 문제