2011-02-09 15 views
12

Yeniden boyutlandırılabilir JScrollPane içeriğimin minimum genişliği vardır. JScrollPane bu genişlikten küçükse, yatay kaydırma çubukları görünmelidir. Bu genişlikten daha büyükse, tüm görünüm alanını doldurmak için görünümün içeriği genişler. JScrollpane değişken boyutlu içerikle yeniden boyutlandırma

basit bir kavram gibi görünüyor ve ben çalışıyor bir şey var, ama bu kesmek gibi hissediyor:

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(); 
     } 
    } 
} 

iletişim yeniden boyutlandırma açıkça görüntü alanı görünümünün tercih boyutunu ayarlar ComponentListener tetikler , bileşen doğrulama tetikleniyor. Ancak yeniden boyutlandırma, titreme kaydırma çubuklarına neden olur. Bunu yapmanın daha temiz bir yolu var mı?

DÜZENLEME: ScrollablePanel bağlantıdan camickr için teşekkürler, ben kaydırılabilir uygulamak ve dinamik getScrollableTracksViewportWidth için dönüş değerini değiştirmek için benim JPanel sınıfı modifiye ettik().

Görüntüleme alanı büyük olduğunda, getScrollableTracksViewportWidth() için true'u döndüğümde, JScrollPane öğesinin görünümümü bileşenimle doldurması gerektiğini söylüyorum. Görüntü alanı küçük olduğunda, false'u döndürürüm, böylece kaydırma çubukları görünür.

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; 
     } 

    } 
} 

cevap

7

emin değil, ancak Scrollable Panel kullanmak mümkün olabilir. Yeniden boyutlandırma işlemini yapılandırabilirsiniz (STRETCH kullanmayı deneyin). Kod, bileşenin tercih edilen boyutunda minimum boyutta çalışır; bu nedenle tam olarak istediğiniz gibi olmayabilir.

+1

Mükemmel! ScrollablePanel sınıfını kullanmıyorum, ancak bu sayfadaki öneri Kaydırılabilir # getScrollableTracksViewportWidth için döndürme değerini dinamik olarak değiştirmek için mükemmel bir şekilde çalışıyor. –

İlgili konular