2012-11-08 5 views
1

현재 제가 만들고있는 게임을위한 GUI를 만들고자하는데 문제가 생기기 시작합니다. 나는 어떤 이유에서든 타이머의 배경을 파란색으로 변경하고 gameGUI의 배경을 메인 보드에 녹색으로 표시 할 수 없습니다. 이것은 처음으로 스윙 프로그래밍 이었기 때문에이 모든 것을 처음 접했습니다.스윙 이슈에서 GUI 프로그래밍하기

나는 layeredpane 사용법에 대해 올바른 방향으로 가고 있는지 궁금합니다. 보드는 계층화 된 패널이 될 수 있어야 항상 이미지를 그 위에 놓을 수 있습니다. 타이머는 위에 태양이있는 하늘이 될 것이고, 구름은 어느 시점에서 태양의 꼭대기를 지나갈 것입니다.

팁을 줄 수 있고 길을 따라 나를 도울 수 있다면 여기저기서 몇 가지 작은 것들만 수정해도 좋을 것입니다.

감사합니다.

public class gameGUI extends JPanel{ 

    private ArrayList<BufferedImage> nativeOne = new ArrayList<BufferedImage>(); 
    private ArrayList<BufferedImage> nativeTwo = new ArrayList<BufferedImage>(); 
    private ArrayList<BufferedImage> nativeThree = new ArrayList<BufferedImage>(); 
    private ArrayList<BufferedImage> exoticOne = new ArrayList<BufferedImage>(); 
    private ArrayList<BufferedImage> exoticTwo = new ArrayList<BufferedImage>(); 
    private ArrayList<BufferedImage> exoticThree = new ArrayList<BufferedImage>(); 

    private static int screenWidth = 680; 
    private static int screenHeight = 680; 

    private JLayeredPane layeredPane; 

    public gameGUI(){   
     layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(new Dimension(680, 680)); 
     layeredPane.setBackground(Color.GREEN); 
     layeredPane.setBorder(BorderFactory.createLineBorder(Color.BLACK,2));   
    } 

    private static JLayeredPane timer(){ 
     JLayeredPane timer = new JLayeredPane(); 
     timer.setPreferredSize(new Dimension(800,120)); 
     timer.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); 
     timer.setBackground(Color.BLUE); 
     return timer; 
    } 

    private static JPanel sideBar(){ 
     //Create the side bar and add buttons 
     JPanel returnMofo = new JPanel(); 
     JButton nativeOne = new JButton(native1); 
     JButton nativeTwo = new JButton(native2); 
     JButton nativeThree = new JButton(native3); 
     JButton exoticOne = new JButton(exotic1); 
     JButton exoticTwo = new JButton(exotic2); 
     JButton exoticThree = new JButton(exotic3); 
     returnMofo.setLayout(new GridLayout(6,1)); 
     returnMofo.setPreferredSize(new Dimension(120, 680)); 
     returnMofo.setBorder(BorderFactory.createLineBorder (Color.BLACK, 2)); 
     returnMofo.add(nativeOne); 
     returnMofo.add(nativeTwo); 
     returnMofo.add(nativeThree); 
     returnMofo.add(exoticOne); 
     returnMofo.add(exoticTwo); 
     returnMofo.add(exoticThree); 
     return returnMofo; 
    } 


    private static void createAndShowGUI(){ 
     JFrame frame = new JFrame(); 
     frame.setTitle("Storm Watch"); 
     frame.setSize(800, 800); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     gameGUI gui = new gameGUI(); 
     frame.add(timer(), BorderLayout.NORTH); 
     frame.add(sideBar(), BorderLayout.WEST); 
     frame.add(gui, BorderLayout.EAST);       

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args){  
     createAndShowGUI();  
    }     
} 

답변

4

opaquelayeredPanetimer을 설정해야합니다. 예를 들어

... 내가 관심을 가지고있는 동안

layeredPane.setOpaque(true); 

당신은 또한, 메인 보드에 layeredPane을 추가 할 수 있습니다 ...

public TestGameBoard() { 
    layeredPane = new JLayeredPane(); 
    layeredPane.setPreferredSize(new Dimension(680, 680)); 
    layeredPane.setBackground(Color.GREEN); 
    layeredPane.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); 
    layeredPane.setOpaque(true); 

    setLayout(new BorderLayout()); // Easy to use layout manager 
    add(layeredPane); // Now I'm visible ;) 
} 

그리고, 당신은 항상 만들어야합니다/이벤트 발송 스레드의 컨텍스트 내에서 UI를 조작 ...

public static void main(String[] args) { 

    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 

} 
+0

+1 코드 예제의 주석 및 "주의가있는 동안"비트 – Laf

+0

감사합니다. 이것은 매우 도움이되었다 :) – Requiem

+0

@Requiem 다행스럽게도 : D – MadProgrammer

2

문제. 우선, setOpaque (true)를 사용해, JLayeredPane를 사용하는 경우에 배경색을 표시 할 필요가 있습니다.

layeredPane.setBackground(Color.GREEN); 
layeredPane.setOpaque(true); 

...

timer.setBackground(Color.BLUE); 
timer.setOpaque(true); 

둘째, 당신은 프레임에 gameGUI 대신 gameGUI의의 layeredPane 추가됩니다. 다음과 같아야합니다 :

frame.add(gui.layeredPane, BorderLayout.EAST);