2012-03-22 8 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()もオーバーライドする方が好きです:-) –

関連する問題