2017-10-01 9 views
1

JScrollPane 안에 JDesktopPane가 있습니다. JDesktopPane에는 프로그래밍 방식으로 추가 된 JInternalFrame이 많이 있습니다.JScrollPane 내의 JDesktopPane 크기 변경 문제

  • JDesktopPane

  • 크기를 조정할 때 JScrollPane 크기가 주요 JFrame의에 따라 변화한다

  • (주 JFrame의 크기보다 훨씬 큰) 고정 된 크기를 가져야한다 :이 동작을하고 싶습니다

기본적으로 모든 이미지 편집기 (예 : Photoshop)와 동일한 동작이지만 이미지 대신보기 포트에 JInternalFrame이 표시됩니다.

처음에는이 동작이 쉽게 발생한다고 생각했지만 제대로 이해하지 못했습니다. 확실히 나는

여기

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의 뷰포트는 크기 나 범위를 존중하지 않는 것이 아니라 크기를 선호하는 관련 SSCCE에게의 ... 레이아웃 또는 뭔가 관련에 대해 뭔가를 누락. 따라서

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 : 뷰포트가 작동하는 방식과 포함 된 구성 요소의 크기를 조정하는 방법을 이해하는 것이 가장 중요합니다. –