2017-10-01 3 views
1

JScrollPaneの中にJDesktopPaneがあります。 JDesktopPaneの中には、プログラムで追加されたJInternalFrameが多数あります。JScrollPane内のJDesktopPaneサイズ変更の問題

をサイズ変更するとき、メインJFrameのに応じて変わるべき

  • JDesktopPaneが固定サイズ(主JFrameのサイズよりはるかに大きい)

  • JScrollPaneサイズを有するべきである:私はこの問題を持っていると思い

イメージのエディタ(Photoshopなど)と基本的に同じ動作ですが、イメージの代わりにビューポートにJInternalFrameが表示されます。

私はこの動作が簡単になると思っていましたが、それを正しく行うことはできません。確かに私は...

をレイアウトや何か関連についての何かが欠けています。ここの関連SSCCEだ

import javax.swing.*; 
import java.awt.Dimension; 
import java.awt.Rectangle; 

class Main extends JFrame { 

    JDesktopPane container = new JDesktopPane(); 

    // New frame with 2 JInternalFrames inside a JDesktopPane inside a JScrollPane 
    Main(){ 
     super("JDesktopPane SS"); 
     setSize(1280, 720); 

     setLayout(new ScrollPaneLayout()); 

     container.setBounds(new Rectangle(1920, 1080)); 

     JScrollPane scrollContainer = new JScrollPane(container, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     setContentPane(scrollContainer); 

     container.add(createFrame()); 
     container.add(createFrame()); 
    } 

    public static void main(String[] args){ 
     SwingUtilities.invokeLater(() -> { 
      // Create new frame with 2 JInternalFrames inside a JDesktopPane inside a JScrollPane 
      JFrame main_frame = new Main(); 

      main_frame.setVisible(true); 
     }); 
    } 

    // Create new InternalFrame with a TextPane 
    private JInternalFrame createFrame(){ 
     JInternalFrame new_frame = new JInternalFrame("Document"); 
     new_frame.setResizable(true); 

     JTextPane txt = new JTextPane(); 
     txt.setPreferredSize(new Dimension(100, 80)); 
     new_frame.add(txt); 

     new_frame.pack(); 
     new_frame.setVisible(true); 

     return new_frame; 
    } 
} 

答えて

1

JScrollPaneのビューポートはサイズや境界を尊重するのではなくサイズが好まれません。したがって

class Main extends JFrame { 

    private static final int DT_WIDTH = 1920; 
    private static final int DT_HEIGHT = 1080; 
    private JDesktopPane container = new JDesktopPane(); 

    public Main(){ 
     super("JDesktopPane SS"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(1280, 720); 

     // setLayout(new ScrollPaneLayout()); // ????? 

     // container.setBounds(new Rectangle(1920, 1080)); 
     container.setPreferredSize(new Dimension(DT_WIDTH, DT_HEIGHT)); 
+0

ありがとうございます、今はうまくいきます!しかし、その方法を使うべきではないでしょうか? – Ararararagi

+0

@Ararararagi:どのメソッド、 'setPreferredSize(...)'?おそらく。純粋な人は、JDesktopPaneまたはビューポートで 'getPreferredSize()'をオーバーライドする必要があります。しかし、 'setSize(...)'や 'setBounds(...) 'を呼び出すことはあまり推奨されないことを理解してください。 –

+0

@Ararararagi:ビューポートがどのように動作するのか、そしてそれが含まれているコンポーネントのサイズを決めるために使用するものを理解することが、最も重要なことです。 –

関連する問題