2012-06-13 49 views
5

Tôi đã cố gắng hàng giờ để tìm cách giải quyết vấn đề, nhưng tôi không có may mắn với điều đó. Dưới đây là một số mẫu mã:JScrollPane không xuất hiện khi sử dụng nó trên JPanel

import java.awt.BorderLayout; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class Example extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 

    public Example() 
    { 
     JPanel contentPane = (JPanel) getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 

     JPanel panTop = new JPanel(new BorderLayout()); 
     //JPanel panBottom = new JPanel(new BorderLayout()); 

     JPanel panTopCenter = new JPanel(); 
     //JPanel panTopLeft = new JPanel(); 
     //JPanel panTopRight = new JPanel(); 

     panTop.add(panTopCenter, BorderLayout.CENTER); 
     //panTop.add(panTopLeft, BorderLayout.WEST); 
     //panTop.add(panTopRight, BorderLayout.EAST); 

     contentPane.add(panTop, BorderLayout.CENTER); 
     //contentPane.add(panBottom, BorderLayout.SOUTH); 

     JPanel pan = new JPanel(); 
     pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS)); 
     for(int i = 0; i < 50; i++) pan.add(new JButton("Button " + i)); 
     JScrollPane scrollPane = new JScrollPane(pan); 
     panTopCenter.add(scrollPane); 

     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     {   
      @Override 
      public void run() 
      { 
       new Example(); 
      } 
     }); 
    } 
} 

Snapshot:

enter image description here

+0

Thay vì sử dụng 'BoxLayout', hãy thử' GridLayout', như được hiển thị trong [ví dụ này] (http://stackoverflow.com/questions/10331129/jscrollpane-resize-containing-jpanel-when-scrollbars-appear/ 10333957 # 10333957), Vì trong 'GridLayout' tất cả' JButton 'sẽ có kích thước bằng nhau, không giống như' BoxLayout', nơi kích thước được xác định bởi văn bản bên trong nó. –

Trả lời

7

Tôi luôn phải đặt kích thước ưa thích của chế độ xem như thế này.

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

public class Example extends JFrame { 

    public Example() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     Box box = new Box(BoxLayout.Y_AXIS); 
     for (int i = 0; i < 50; i++) { 
      box.add(new JButton("Button " + i)); 
     } 
     JScrollPane sp = new JScrollPane(box); 
     Dimension d = new Dimension(box.getComponent(0).getPreferredSize()); 
     sp.getVerticalScrollBar().setUnitIncrement(d.height); 
     d.height *= 10; // Show at least 10 buttons 
     sp.getViewport().setPreferredSize(d); 

     add(sp, BorderLayout.CENTER); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Example e = new Example(); 
      } 
     }); 
    } 
} 
+2

Bạn cũng có thể thực hiện 'Scrollable'. – trashgod

3

Bạn cần phải thiết lập các ưu tiên kích thước, trong trường hợp đó JScrollPane là đơn JComponent trong bình đựng chất hay cấp cao nhất thùng đựng hàng.

scrollPane.setPreferredSize(new Dimension(100,500)); 

Tốt hơn là sử dụng GridLayout cho cùng loại JComponent s.

+0

Nhưng khi tôi làm điều đó, 'panTopCenter' sẽ có kích thước tĩnh và sẽ không phóng to động khi mở rộng kích thước JFrame. –

+0

[thì điều này có thể đúng cách] (http://stackoverflow.com/a/5760093/714968) – mKorbel

+0

Tôi nghĩ bạn có thể thay đổi kích thước của khung nhìn như [ở đây] (http://stackoverflow.com/a/11016543/ 261156). –

7

Không đặt bất kỳ kích thước nào! Thanh cuộn xuất hiện nếu thay đổi này được thực hiện.

JPanel panTopCenter = new JPanel(new GridLayout()); 

Vấn đề cơ bản là FlowLayout sẽ hiển thị các thành phần ở kích thước nhỏ nhất cần thiết để hiển thị nó, và cho một cuộn cửa sổ, đó là (quyết định được) 0x0. Bằng cách sử dụng GridLayout không có đối số trong hàm tạo và thêm cửa sổ cuộn làm thành phần duy nhất, nó sẽ bị buộc phải lấp đầy khoảng trống sẵn có.

+1

+1 IIUC, vấn đề là kích thước khung nhìn ưa thích kết quả là khó sử dụng và (có thể) phụ thuộc vào L & F. Tôi sẽ ủng hộ việc thực thi 'getPreferredScrollableViewportSize()'. – trashgod

+0

@trashgod Tôi có thể thấy các tình huống trong đó thiết lập kích thước cổng xem ưa thích có thể cần thiết, nhưng luôn luôn rất thận trọng về 'đặt ** bất kỳ kích thước ** nào'. Đó là điều tôi chỉ nhìn, sau khi kiệt sức các khả năng khác. –

+0

@both Tôi thừa nhận, tôi không hiểu rất rõ câu hỏi này +1 cho câu trả lời chính xác có thể là – mKorbel

0

Giải pháp tốt nhất, nhanh chóng và dễ dàng, đang sử dụng JXPanel từ SwingX, chuẩn gần như và thực hiện Scrollable.

Các vấn đề liên quan