2012-03-22 56 views
1

我相信JViewport可以與JPanel一起工作,但是當我構建一個擴展JPanel的新類時,它看起來好像JViewport被程序忽略。我不知道如果我做錯什麼,所以這是我的測試進行,仍然會得到相同的結果:JViewport不會爲JPanel的派生類生成一個視口

public class panel extends JPanel 
{ 
    public panel() 
    { 
     super(); 
    } 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     g.drawString("Hello World", 50, 50); 
     g.setColor(Color.RED); 
     g.fillRect(50,50,100,100); 
     g.setColor(Color.BLACK); 
     g.fillOval(100, 100, 50, 50); 
    } 
} 

public class test extends JFrame 
{ 
    private panel p; 
    public void init() 
    { 
     this.setSize(1000, 1000); 
     this.setLayout(new BorderLayout()); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setVisible(true); 

     p = new panel(); 
     p.setOpaque(false); 

     JViewport v = new JViewport(); 
     v.setViewSize(new Dimension(200,200)); 
     v.setViewPosition(new Point(2000,2000)); 
     v.setView(p); 
     this.add(v,BorderLayout.CENTER); 
    } 
    public test() 
    { 
     init(); 
    } 
    public static void main(String[] args) 
    { 
     test t = new test(); 
    } 

} 

它想展現畫JPanel的一部分,但JFrame的窗口只顯示全JPanel的。因此,我不知道我是否做了任何錯誤或JViewport不是爲此目的而構建的。如果是後者,那麼如果任何人都可以提出解決方案,這將是非常好的。

感謝

回答

2

BorderLayout你使用是造成視,這是擺在中心,採取框架內的整個空間,因爲存在這樣的佈局沒有其他組件。這就是BorderLayout的工作原理。

因此,視口也被賦予比定義大的尺寸(尺寸被佈局管理器覆蓋)。由於面板沒有固定大小,它也將被調整大小。

爲了改變這種情況,可以使用不同的佈局管理器,或者爲視口設置最小/最大尺寸,並覆蓋面板的getPreferredSize()

附註:不要使用小寫類名稱,如panel

+0

+ !,看起來像是當你重寫'paintComponent(...)'時總是喜歡重寫'getPreferredSize()':-) – 2012-03-22 17:24:02