2015-06-16 77 views
1

所以我想創建一個自定義組件,所以我可以設置我的滾動窗格的大小。以下是帶有滾動窗格的部分:自定義JComponent設置首選的可滾動視口大小

JScrollPane scrollPane = new JScrollPane(leftTop); 
customScroll t1 = new customScroll(); 
scrollPane.add(t1); 
left.add(scrollPane); 

leftTop是左側內嵌的面板。這裏是我的customScroll類,這是我在做,所以我可以設置滾動窗格的大小定製組件:

public class customScroll extends JComponent implements Scrollable { 

    public customScroll() { 
     getPreferredScrollableViewportSize(); 
    } 

    @Override 
    public Dimension getPreferredScrollableViewportSize() { 
     return(new Dimension(266,300)); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
    } 

    @Override 
    public int getScrollableBlockIncrement(Rectangle visibleRect, 
      int orientation, int direction) { 
     return 0; 
    } 

    @Override 
    public boolean getScrollableTracksViewportHeight() { 
     return false; 
    } 

    @Override 
    public boolean getScrollableTracksViewportWidth() { 
     return false; 
    } 

    @Override 
    public int getScrollableUnitIncrement(Rectangle visibleRect, 
      int orientation, int direction) { 
     return 0; 
    } 
} 

如何設置首選滾動大小?

+0

請注意Java的命名約定 - http://www.oracle.com/technetwork/java/codeconventions -135099.html - 尤其是類名;另外,請提一下你面臨的確切問題? –

回答

1

提供一個setter ...

public void setPreferredScrollableViewportSize(Dimension size) { 
    this.preferredScrollableViewportSize = size; 
} 

現在,很明顯,你getPreferredScrollableViewportSize需要返回這個值...

public class CustomScroll extends JComponent implements Scrollable { 

    private Dimension preferredScrollableViewportSize = new Dimension(266, 300); 

    public CustomScroll() { 
    } 

    public void setPreferredScrollableViewportSize(Dimension size) { 
     this.preferredScrollableViewportSize = size; 
    } 

    @Override 
    public Dimension getPreferredScrollableViewportSize() { 
     return preferredScrollableViewportSize; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
    } 

    @Override 
    public int getScrollableBlockIncrement(Rectangle visibleRect, 
        int orientation, int direction) { 
     return 64; 
    } 

    @Override 
    public boolean getScrollableTracksViewportHeight() { 
     return false; 
    } 

    @Override 
    public boolean getScrollableTracksViewportWidth() { 
     return false; 
    } 

    @Override 
    public int getScrollableUnitIncrement(Rectangle visibleRect, 
        int orientation, int direction) { 
     return 64; 
    } 
} 

還應該設置這個在您的JScrollPane包之前,它會更容易管理,否則,您需要invalidate其中JScrollPane所在的容器

Yo ü可能想通過Code Conventions for the Java TM Programming Language有一讀,它將使人們更容易閱讀您的代碼,供您閱讀別人

但是,這仍然只是得到最佳尺寸

沒有它不會,它將使用preferredScrollableViewportSize(假設你內JScrollPane

我的滾動窗格中調整到什麼是它,所以它只是成長的按鈕添加

在包裝0

然後你做錯事

JScrollPane scrollPane = new JScrollPane(leftTop);  
customScroll t1 = new customScroll(); 
// This is wrong... 
scrollPane.add(t1); 
left.add(scrollPane); 

你不應該添加任何東西到JScrollPane,這不是他們的工作,相反,你需要在它

leftTop t1 = new CustomScroll(); 
JScrollPane scrollPane = new JScrollPane(leftTop);  
left.add(scrollPane); 
包裹組件

或其他一些...

我希望它保持一個固定的大小,所以我需要明確地設置它可以cann從

OT偏離是的,這就是preferredScrollableViewportSize

ExampleLayout

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.Rectangle; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.Scrollable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class JavaApplication57 { 

    public static void main(String[] args) { 
     new JavaApplication57(); 
    } 

    public JavaApplication57() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      CustomScroll comp = new CustomScroll(); 
      comp.setPreferredScrollableViewportSize(new Dimension(100, 100)); 

      comp.setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.weightx = 1; 
      gbc.insets = new Insets(5, 10, 10, 5); 
      for (int index = 0; index < 100; index++) { 

       JButton btn = new JButton("Hello world " + index); 
       comp.add(btn, gbc); 

      } 

      add(new JScrollPane(comp)); 
     } 

    } 

    public class CustomScroll extends JComponent implements Scrollable { 

     private Dimension preferredScrollableViewportSize = new Dimension(266, 300); 

     public CustomScroll() { 
     } 

     public void setPreferredScrollableViewportSize(Dimension size) { 
      this.preferredScrollableViewportSize = size; 
     } 

     @Override 
     public Dimension getPreferredScrollableViewportSize() { 
      return preferredScrollableViewportSize; 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
     } 

     @Override 
     public int getScrollableBlockIncrement(Rectangle visibleRect, 
         int orientation, int direction) { 
      return 64; 
     } 

     @Override 
     public boolean getScrollableTracksViewportHeight() { 
      return false; 
     } 

     @Override 
     public boolean getScrollableTracksViewportWidth() { 
      return false; 
     } 

     @Override 
     public int getScrollableUnitIncrement(Rectangle visibleRect, 
         int orientation, int direction) { 
      return 64; 
     } 
    } 
} 
+0

但是,這仍然會得到首選的大小,我的滾動窗格調整到它的內容,所以它只是增加了按鈕。我希望它保持一個固定的大小,所以我需要明確地設置它不能偏離的大小。 –

+0

nvm我很遲鈍,不能閱讀文檔頁面。 +1爲你的答案雖然哈哈。 –

相關問題