2013-01-02 212 views
2

我有一個類可以繪製線條,圓形和矩形等非常簡單的圖形。這些行是動態可擴展的,有時當它們擴展超出分辨率時,沒有滾動條是不可能看到的。因此,我已經將JScrollPane添加到了我的JFrame中,但不幸的是,儘管已經調用了佈局管理器,但滾動條並不是可滾動的。JScrollPane滾動條不可滾動

這是我有: - 繪製組件(直線,矩形,圓)類 - 即樹立的JFrame/JScrollPane的

這裏是我的GUI類的摘錄代碼A類:

JFrame frame = new JFrame("GUIFrame"); 
    frame.setLayout(new BorderLayout()); // Layout already set 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    DrawComponent comp = new DrawComponent(); // Reference to class that draw components 
    JScrollPane sp = new JScrollPane(comp, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 
    sp.setPreferredSize(new Dimension(1000, 1000)); 

    frame.add(sp, BorderLayout.CENTER); 
    frame.setSize(500,500); 
    frame.setVisible(true); 

隨着上面的代碼,我有Java向我展示了一個帶有包含我的jcomponents的scrollpane的JFrame。我已經將滾動條設置爲始終如上所示,但它們不可滾動,灰色。

至於建議由安德魯,我花了一段時間來創建一個SSCCE反映我想要做的事:

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 
import java.util.Random; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.ScrollPaneConstants; 


public class DrawTest { 
    public static void main(String[] args){ 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setLayout(new BorderLayout()); 
     frame.setSize(1000, 1000); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

     DrawComp d = new DrawComp(); 
     JScrollPane sp = new JScrollPane(d, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 

     frame.add(sp);  
     frame.setVisible(true); 
    } 
} 

class DrawComp extends JComponent { 

    public void paintComponent(Graphics g){ 
     Graphics2D g2 = (Graphics2D)g; 

     Random ran = new Random(); 
     int ranNum = ran.nextInt(10); 
     System.out.println(ranNum); 
     double length = 100 * ranNum; 
     g2.draw(new Line2D.Double(10, 10, length, length)); 
    } 
} 

上面的代碼繪製基於隨機輸入的對角線。我打算做的事情是,當線條變得太長以至於超出幀尺寸時,我希望能夠滾動並查看整個線條。我再次將行組件添加到JScrollPane,但它不能滾動。

+0

1)爲了更好地幫助您,請發佈[SSCCE](http://sscce.org/ )。 2)'comp.setPreferredSize(new Dimension(1000,1000)); sp.validate(); (新維度(1000,1000));'3)'frame.pack();' –

+0

我想你需要看看[如何使用滾動窗格](http:// docs。 oracle.com/javase/tutorial/uiswing/components/scrollpane.html)以更好地理解它們的工作方式。 'sp.setPreferredSize(new Dimension(1000,1000));'不會影響可滾動區域,但會影響組件的大小。 'ViewPort'負責確定可滾動區域(至少從你試圖實現的角度來看) – MadProgrammer

+0

感謝你的幫助,但我的印象是不鼓勵使用setPreferredSize? –

回答

1

我的歉意。您正確使用JScrollPane。我運行了你的代碼,我想我得到了JScrollPane不工作的原因。想象一下,當你將jframe的背景設置爲全紅(通過在任何地方點一個紅點),jscrollpane是否可以滾動?不,因爲繪製背景顏色在後臺。實際的VIEW不會改變,它不會比顯示尺寸大,所以滾動窗口看不到滾動的點。你的繪畫組件方法正在做類似的事情。它只是在背景中畫東西。實際的VIEW沒有改變,所以scrollpane不會工作。

public class DrawTest { 
    public static void main(String[] args){ 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setLayout(new BorderLayout()); 
     frame.setSize(500, 500); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

     final DrawComp d = new DrawComp(); 
     final JScrollBar hbar,vbar; 
     hbar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 500); 
     vbar = new JScrollBar(JScrollBar.VERTICAL, 0, 1, 0, 500); 

     frame.setLayout(null); 
     frame.add(d);  
     frame.add(hbar);  
     frame.add(vbar);  
     d.setBounds(0, 0, 300, 300); 
     vbar.setBounds(460, 0, 20, 480); 
     frame.setVisible(true); 

     vbar.addAdjustmentListener(new AdjustmentListener() 
     { 
      public void adjustmentValueChanged(AdjustmentEvent e) 
      { 
       d.setLocation(d.getX(), -vbar.getValue()); 
      } 
     }); 
    } 
} 

這裏是垂直滑動組件的代碼。我對現有的代碼做了一些更改。 DrawComp仍然是一樣的

+0

我在JScrollPane sp = new JScrollPane(comp)中添加了我的組件以滾動窗格。爲了在窗口中顯示scoll窗格,我必須將滾動窗格添加到框架中,是不是正確?我無法發現我做錯了什麼 –

+0

首先設置組件的大小。所有繪畫都將在該組件的大小矩形(剪輯區域)中發生。如果你試圖畫出任何東西,它將被忽略。它不會像您期望的那樣滾動。 – basiljames

+0

我的歉意。您正確使用JScrollPane。我運行了你的代碼,我想我得到了JScrollPane不工作的原因。 – Xiaoerge

0

我發現了一個臨時解決方案來解決我的問題。鑑於繪圖的簡單程度,我決定使用該行的結束點來覆蓋preferredSize。

用於修飾我上面張貼的SSCCE,我的paintComponent()加入了setPreferredSize(新尺寸(長度,長度)使得首選大小將總是當它被稱爲線的終點,這使得確定我已經得到了整個油畫的覆蓋面積,但能夠滾動,如果有需要的話。

+2

相反,重寫'getPreferredSize()',建議[這裏](http://stackoverflow.com/q/7229226/230513)。 – trashgod

+1

在paintComponent()_中添加了一個setPreferredSize(新維度(長度,長度)),它**非常**有臭味,同時違反了兩條基本規則:a)在繪製週期內永遠不會改變組件的狀態b)根本不要調用setPreferredSize。 – kleopatra