2011-02-09 4 views
12

크기 조정이 가능한 JScrollPane의 내용의 너비가 최소입니다. JScrollPane가이 폭보다 작은 경우, 수평 스크롤 바가 표시됩니다. 이 너비보다 큰 경우 뷰포트 내용이 확장되어 전체 뷰포트를 채 웁니다. JScrollpane 가변 크기 내용으로 크기 조정

는 간단한 개념 같아, 내가 일하고있어 뭔가있어하지만, 해킹 같은 느낌 :

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 

public class SSBTest { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       final Component view = new MyView(); 
       final JScrollPane jScrollPane = new JScrollPane(view); 
       jScrollPane.addComponentListener(new ComponentAdapter() { 
        @Override 
        public void componentResized(final ComponentEvent e) { 
         final Dimension minimumSize = view.getMinimumSize(); 
         final int width = Math.max(minimumSize.width, jScrollPane.getViewport().getWidth()); 
         view.setPreferredSize(new Dimension(width, minimumSize.height)); 
        } 
       }); 
       showInDialog(jScrollPane); 
      } 
     }); 
    } 

    private static void showInDialog(final JScrollPane jScrollPane) { 
     final JDialog dialog = new JOptionPane(jScrollPane).createDialog("JScrollPane Resize Test"); 
     dialog.setResizable(true); 
     dialog.setModal(true); 
     dialog.setVisible(true); 
     System.exit(0); 
    } 

    private static final class MyView extends JPanel { 
     @Override 
     protected void paintComponent(final Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.RED); 
      g.drawString("Dimensions are " + getSize(), 10, 20); 
      g.drawRect(0, 0, getMinimumSize().width-1, getMinimumSize().height-1); 
      g.setColor(Color.BLUE); 
      g.drawRect(0, 0, getPreferredSize().width-1, getPreferredSize().height-1); 
     } 

     @Override 
     public Dimension getMinimumSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return super.getPreferredSize(); 
     } 
    } 
} 

대화 상자 크기 조정 명시 적으로 뷰포트의 뷰의 추천 사이즈를 설정하는있는 ComponentListener를 트리거 , 구성 요소 유효성 검사를 트리거합니다. 그러나 크기를 조정하면 지저분한 스크롤 막대가 생깁니다. 이 작업을 수행하는 더 깨끗한 방법이 있습니까?

편집 : ScrollablePanel 링크에 대한 camickr에 덕분에, 나는 스크롤 구현, 동적 getScrollableTracksViewportWidth에 대한 반환 값을 변경하는 내 JPanel의 클래스를 수정 한().

뷰포트가 큰 경우 getScrollableTracksViewportWidth()에 대해 true을 반환하고 JScrollPane에 내 구성 요소로보기를 채우라고 알려줍니다. 뷰포트가 작 으면 false을 반환하므로 스크롤 막대가 나타납니다.

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

public class SSBTest { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       final Component view = new MyView(); 
       final JScrollPane jScrollPane = new JScrollPane(view); 
       showInDialog(jScrollPane); 
      } 
     }); 
    } 

    private static void showInDialog(final JScrollPane jScrollPane) { 
     final JDialog dialog = new JOptionPane(jScrollPane).createDialog("JScrollPane Resize Test"); 
     dialog.setResizable(true); 
     dialog.setModal(true); 
     dialog.setVisible(true); 
     System.exit(0); 
    } 

    private static final class MyView extends JPanel implements Scrollable { 
     @Override 
     protected void paintComponent(final Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.RED); 
      g.drawString("MyView: " + getWidth() + "x" + getHeight(), 10, 20); 
      g.drawRect(0, 0, getMinimumSize().width-1, getMinimumSize().height-1); 
      g.setColor(Color.BLUE); 
      g.drawRect(0, 0, getPreferredSize().width-1, getPreferredSize().height-1); 
      g.drawString("Preferred/Minimum Size", 10, getPreferredSize().height/2); 
      g.setColor(Color.GREEN); 
      g.drawLine(0, 0, getWidth(), getHeight()); 
     } 

     @Override 
     public Dimension getMinimumSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return getMinimumSize(); 
     } 

     public Dimension getPreferredScrollableViewportSize() { 
      return getPreferredSize(); 
     } 

     public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation, final int direction) { 
      return 10; 
     } 

     public int getScrollableBlockIncrement(final Rectangle visibleRect, final int orientation, final int direction) { 
      return visibleRect.width; 
     } 

     public boolean getScrollableTracksViewportWidth() { 
      final Container viewport = getParent(); 
      return viewport.getWidth() > getMinimumSize().width; 
     } 

     public boolean getScrollableTracksViewportHeight() { 
      return true; 
     } 

    } 
} 

답변

7

확실하지 않지만 사용자는 Scrollable Panel을 사용할 수 있습니다. 구성 요소 크기 조정을 구성 할 수 있습니다 (STRETCH 사용). 이 코드는 최소 크기가 아닌 원하는 크기의 구성 요소에서 작동하므로 원하는 내용이 아닐 수도 있습니다.

+1

Perfect! ScrollablePanel 클래스를 사용하지 않지만 스크롤 가능한 # getScrollableTracksViewportWidth의 반환 값을 동적으로 변경하라는 해당 페이지의 제안이 완벽하게 작동합니다. –

관련 문제