2012-11-06 39 views
3

我有一個面板佈局問題,我似乎無法解決。我有以下代碼:如何在JScrollPane中獲得水平滾動條

public class Test extends ApplicationFrame { 
    public Test(String title) { 
     super(title); 

     JPanel jpanel = new JPanel(); 
     jpanel.setPreferredSize(new Dimension(100 * 2, 300)); 
     jpanel.setBackground(new Color(0xFF0000)); 

     JScrollPane scrollPane = new JScrollPane(jpanel); 
     scrollPane.setBackground(new Color(0xFF0000)); 
     scrollPane.getViewport().setPreferredSize(new Dimension(100 * 2, 300)); 

     this.add(scrollPane, BorderLayout.WEST); 
     this.setPreferredSize(new Dimension(500, 500)); 
    } 

    public static void main(String args[]) { 
     Test test = new Test("Layout Test"); 
     test.pack(); 
     RefineryUtilities.centerFrameOnScreen(test); 
     test.setVisible(true); 
    } 
} 

創建以下佈局:

enter image description here

當我拖動窗口的右側並將其移動到紅色JPanelJScrollPane,我'd想水平滾動條出現在JScrollPane上。但是目前窗口縮小而沒有顯示水平滾動條。這可能嗎?

我想保留BorderLayout.WEST,因爲我的使用案例是爲了防止JFreeChart在我沒有足夠大的圖表填充整個窗口時伸展。

+1

的'WEST'組件沒有真正開始 「壓縮」 水平。在這種情況下,我不'BorderLayout'是你的朋友 – MadProgrammer

+0

@MadProgrammer你有建議哪個佈局管理器會是更好的選擇嗎? –

+0

我的直覺是'GridBagLayout',但我還不確定它會服務於你的目的 – MadProgrammer

回答

6

many reasons不使用setPreferredSize(),但這裏的關鍵之一是期望的結果取決於在封閉組件的首選尺寸。特別是,

  • ChartPanel具有由JPanel指定的默認FlowLayout,但圖表忽略此並調整以填充可用的空間;您可以覆蓋getPreferredSize()以選擇任何所需的初始幾何體。

  • JScrollPane的滾動條僅在視口大小小於內容大小時纔會顯示。 BorderLayout.WESTBorderLayout.EAST不會更改,所以滾動條從不出現。

調用pack()「導致此Window的大小,以適應首選大小和其子組件的佈局。」在下面的示例中,在pack()之後爲了使滾動條出現而人爲地減小了框架的大小。 GridLayout導致兩個面板大小相等。調整框架大小以查看效果。

附錄:如果您想要ChartPanel具有固定大小,請將其添加到JPanel;默認FlowLayout使用首選大小。

image

public class ChartPanelTest { 

    private static final int N = 64; 
    private static final int SIZE = 400; 
    private static final Random random = new Random(); 

    private static XYDataset createDataset() { 

     final TimeSeries series = new TimeSeries("Random Data"); 
     Day current = new Day(); 
     for (int i = 0; i < N; i++) { 
      series.add(current, random.nextGaussian()); 
      current = (Day) current.next(); 
     } 
     return new TimeSeriesCollection(series); 
    } 

    private static JFreeChart createChart(final XYDataset dataset) { 
     JFreeChart chart = ChartFactory.createTimeSeriesChart(
      "Test", "Day", "Value", dataset, false, false, false); 
     return chart; 
    } 

    public static void main(String[] args) { 

     JFrame f = new JFrame(); 
     f.setLayout(new GridLayout(1, 0)); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JFreeChart chart = createChart(createDataset()); 
     f.add(new JScrollPane(new JPanel() { 

      { 
       setBackground(Color.red); 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(SIZE, SIZE); 
      } 
     })); 
     f.add(new ChartPanel(chart) { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(SIZE, SIZE); 
      } 
     }); 
     f.pack(); 
     f.setSize(2 * (SIZE - N), SIZE - N); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

參考這看起來是我正在尋找完成。仍然必須翻譯成真正的應用程序,但演示是非常有用的。謝謝!這也是JFreeChart的不錯選擇。 :D –

+0

能夠成功集成到實際應用程序中。再次感謝! –

+0

優秀;也考慮'JSplitPane',顯示[here](http://stackoverflow.com/a/10110232/230513)。 – trashgod

0

它可以完成。你可以聲明三個JPanel。 一個JPanel是一個contentPanel白色BorderLayout。 定在preferedSize和JPanel的MAXIMUMSIZE你想要一個滾動條 創建jscroolpane及其處理: 僞代碼:

JPanel contentPanel = new JPanel(new BorderLayuout()); 
JPanel jpanel1 = new JPanel(layout--); 
JPanel jpanel2 = new JPanel(layout--); 
jpanel2.setPreferredSize(..); 
jpanel2.setMaximuSize(..); 
JScrollPane jsp = new JScroolPane(jpanel2); 
contentPanel.add(jpanel1,BorderLayout.WEST); 
contentPanel.add(jsp,BorderLayout.CENTER); 
this.getContentPane().add(contentPanel); 
在我的例子滾動條

爲中心。 如果你想改變

contentPanel.add(jsp,BorderLayout.WEST); 
contentPanel.add(jpanel1,BorderLayout.CENTER); 
+0

-1對於setXXSize - 由於原因_不做,請參閱@trashgod的答案 – kleopatra