2011-10-29 76 views
6

Tôi đang cố gắng xây dựng một hình ảnh dựa trên đầu vào của người dùng. Những gì tôi đang cố gắng làm là tạo ra một loạt các đồ họa và thêm chúng như là lớp tuy nhiên tôi đang gặp một số vấn đề khi chúng không xuất hiện. Đây là mã tôi đang sử dụng:Đồ họa không hiển thị trong JLayeredPane (java swing)

public class ClassA 
{ 
    protected final static int dimesionsY = 1000; 
    private static int dimesionsX; 
    private static JFrame window; 
    private static JLayeredPane layeredPane; 

    public void init() 
    { 
     window = new JFrame("Foo"); 
     dimesionsX = // some user input 
     window.setPreferredSize(new Dimension(dimesionsX, dimesionsY)); 
     window.setLayout(new BorderLayout()); 

      layeredPane = new JLayeredPane(); 
     layeredPane.setBounds(0, 0, dimesionsX, dimesionsY); 
     window.add(layeredPane, BorderLayout.CENTER); 

      ClassB myGraphic = new ClassB();  
     myGraphic.drawGraphic(); 

     layeredPane.add(myGrpahic, new Integer(0), 0); 

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



public class ClassB extends JPanel 
{ 
    public void drawGraphic() 
    { 
     repaint(); 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     g.setColor(Color.BLACK); 
     g.fillRect(10, 10, 100, 100); 
    } 
} 

Tuy nhiên đồ họa của tôi dường như không hiển thị và tôi không hiểu tại sao. Tôi cũng đã thử thêm nó vào một số JPanel trước tiên, thêm rằng JPanel vào số JLayeredPane tuy nhiên cũng không hoạt động.

Xin vui lòng ai đó có thể giúp tôi?

Trả lời

13

Nếu bạn thêm một thành phần vào JLayeredPane, nó giống như thêm nó vào một sơ đồ rỗng bằng cách sử dụng vùng chứa: bạn phải chỉ định đầy đủ kích thước và vị trí của thành phần.

ví dụ

import java.awt.*; 

import javax.swing.*; 

public class ClassA { 
    protected final static int dimesionsY = 800; 
    protected final static int dimesionsX = 1000; //!! 
    private static JFrame window; 
    private static JLayeredPane layeredPane; 

    public void init() { 
     window = new JFrame("Foo"); 
     // !! dimesionsX = // some user input 

     //!! window.setPreferredSize(new Dimension(dimesionsX, dimesionsY)); 
     window.setLayout(new BorderLayout()); 

     layeredPane = new JLayeredPane(); 
     //!! layeredPane.setBounds(0, 0, dimesionsX, dimesionsY); 
     layeredPane.setPreferredSize(new Dimension(dimesionsX, dimesionsY)); 
     window.add(layeredPane, BorderLayout.CENTER); 

     ClassB myGraphic = new ClassB(); 
     myGraphic.drawGraphic(); 

     myGraphic.setSize(layeredPane.getPreferredSize()); 
     myGraphic.setLocation(0, 0); 
     //!! layeredPane.add(myGraphic, new Integer(0), 0); 
     layeredPane.add(myGraphic, JLayeredPane.DEFAULT_LAYER); 

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

    public static void main(String[] args) { 
     new ClassA().init(); 
    } 
} 

class ClassB extends JPanel { 
    public void drawGraphic() { 
     repaint(); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.setColor(Color.BLACK); 
     g.fillRect(10, 10, 100, 100); 
    } 
} 
+0

Ngoài ra, nếu bạn đang đặt JPanels trên đầu trang của mỗi khác, hy vọng bạn đang chăm sóc mà đục được thiết lập là false. Một giải pháp cho vấn đề của bạn bao gồm phân lớp BufferedImages trên đầu trang của mỗi khác. –

+0

Cảm ơn bạn đã giúp đỡ về điều này. Tôi nhận thấy bạn đã sử dụng 'JLayeredPane.DEFAULT_LAYER' khi thêm hình ảnh. Tôi chỉ tự hỏi điều gì là tốt nhất để sử dụng trong trường hợp tôi muốn thêm đồ họa bổ sung? –

+0

Tôi sẽ sử dụng bất kỳ logic nào ra lệnh để làm việc tốt nhất. Nếu tôi có một cái gì đó mà tôi biết sẽ ở phía dưới, tôi sẽ đặt nó trong lớp Mặc định. –

0

Xem Laying Out Components in a Layered Pane, từ Java Tutorials.

Ngoài ra, đôi khi bạn cần phải thiết lập kích thước ưa thích:

layeredPane.setPreferredSize(new Dimension(width, height));

Các vấn đề liên quan