2012-02-22 58 views
17

Tôi có một JFrame, trong JFrame này tôi có một JPanel mà tôi vẽ, Panel này có thể có kích thước bất kỳ và vì vậy tôi đặt nó vào một JScrollpane để cho tôi cuộn khi bảng lớn hơn kích thước màn hình cửa sổ.Java JPanel bên trong JScrollPane?

Đáng tiếc là không làm việc như tôi mong đợi:

  1. Làm cho cửa sổ JFrame nhỏ hơn kích thước JPanel không hiển thị thanh cuộn

  2. Kích thước JScrollPane nay dường như bị khóa để kích thước của JPanel Tôi đã thêm vào nó, nơi mà trước khi nó thay đổi kích cỡ để giới hạn của nó là cửa sổ JFrame (nó vẫn kinda hiện này nhưng chỉ theo chiều dọc bây giờ ?!)

  3. JPanel dường như giả định kích thước của các JScrollpane regar vô số những gì tôi đặt cho kích thước ưa thích

Tôi chắc chắn tôi đang làm điều gì đó ngu ngốc, nếu ai đó có thể chỉ ra điều tôi sẽ biết ơn nhất!

JPanel _ImageCanvas = new JPanel(); // 'Canvas' to draw on 
JScrollPane _ScrollPane = new JScrollPane(); 

// set size of 'canvas' 
_ImageCanvas.setMinimumSize(new Dimension(100,100)); 

// Scroll pane smaller then the size of the canvas so we should get scroll bars right? 
_ScrollPane.setMinimumSize(new Dimension(50,50)); 

// Add a border to 'canvas' 
_ImageCanvas.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); 

_ScrollPane.setViewportView(JPanel); 

Rất cám ơn

David

+8

hãy tìm hiểu quy ước đặt tên java và dính vào họ – kleopatra

+2

Khi bạn nói _ScrollPane.setViewportView (JPanel); Tôi giả sử bạn có nghĩa là ví dụ JPanel _ImageCanvas –

Trả lời

13

setPreferredSize() là mẹo, setMinimumSize() và thậm chí setSize() trên thành phần sẽ bị bỏ qua bởi JScrollPane. Đây là một ví dụ làm việc sử dụng đường viền màu đỏ.

import java.awt.*; 

import javax.swing.*; 

public class Scroller extends JFrame { 

    public Scroller() throws HeadlessException { 
     final JPanel panel = new JPanel(); 
     panel.setBorder(BorderFactory.createLineBorder(Color.red)); 
     panel.setPreferredSize(new Dimension(800, 600)); 

     final JScrollPane scroll = new JScrollPane(panel); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     add(scroll, BorderLayout.CENTER); 
     setSize(300, 300); 
     setVisible(true); 
    } 

    public static void main(final String[] args) throws Exception { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Scroller().setVisible(true); 
      } 
     }); 
    } 
} 
0

Theo như tôi nhớ có 2 lựa chọn:

Để biết thêm chi tiết, xem Javadoc: http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html

+0

Xin chào Puce, cảm ơn các đề xuất, hóa ra tôi cần thêm một 'chủ' jPanel vào scrollView và sau đó cung cấp cho nó một trình quản lý bố cục để có được hiệu ứng mong muốn. – FiniteRed

1
  • Đặt kích thước ưa thích trên vải.
  • Tăng kích thước 100,100 quá nhỏ trên máy tính của tôi.
  • Bạn có thể muốn sử dụng GridLayout mới (1,1); cho bạn JFrame nếu bạn muốn scrollpane mở rộng khi bạn mở rộng khung.
7
// suggest a size of 'canvas' 
_ImageCanvas.setPreferredSize(new Dimension(100,100)); 

// Scroll pane smaller then the size of the canvas so we should get scroll bars right? 
_ScrollPane.setPreferredSize(new Dimension(50,50)); 

// ..later 
_Frame.pack(); 
+0

frame.pack(); lại yêu nó. –

0

Kiểm tra các giao diện Scrollable, điều này có thể giúp với các vấn đề kích thước.

Hai phương pháp có thể hữu ích:

boolean getScrollableTracksViewportWidth(); 

boolean getScrollableTracksViewportHeight(); 
Các vấn đề liên quan