2012-05-02 55 views
8

Tôi có JScrollPane chứa một số hình ảnh trong một hàng ngang. Nếu hàng hình ảnh quá dài đối với cổng xem, JScrollPane sẽ hiển thị thanh cuộn, giảm chiều cao của cổng xem. Tôi muốn thay đổi kích thước hình ảnh để phù hợp với cổng xem. Làm thế nào tôi có thể phát hiện rằng cổng xem đã thay đổi kích thước của nó? Thật không may, đăng ký xử lý sự kiện thay đổi dường như không hoạt động.Làm cách nào để phát hiện xem thanh cuộn của JScrollPane có thay đổi mức hiển thị không?

Trả lời

12

Sử dụng trình nghe thay đổi trên ViewPort có vẻ phù hợp với tôi. Đây là một bản demo nhỏ rằng:

import java.awt.BorderLayout; 
import java.io.UnsupportedEncodingException; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingWorker; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Main { 

    public static void main(String[] args) throws UnsupportedEncodingException { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(new BorderLayout()); 
     final JPanel buttons = new JPanel(); 
     final JScrollPane pane = new JScrollPane(buttons); 
     pane.getViewport().addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       System.err.println("Change in " + e.getSource()); 
       System.err.println("Vertical visible? " + pane.getVerticalScrollBar().isVisible()); 
       System.err.println("Horizontal visible? " + pane.getHorizontalScrollBar().isVisible()); 
      } 
     }); 
     panel.add(pane); 
     frame.setContentPane(panel); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 
     SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() { 

      @Override 
      protected Void doInBackground() throws Exception { 
       for (int i = 0; i < 10; i++) { 
        Thread.sleep(800); 
        buttons.add(new JButton("Hello " + i)); 
        buttons.revalidate(); 
       } 
       return null; 
      } 
     }; 
     worker.execute(); 
    } 
} 
+0

Okay , kỳ dị. Cảm ơn đã trả lời nhanh chóng. Tôi đã thử nó và nó thực sự hoạt động. Than ôi, bên trong ứng dụng của tôi, thêm một người nghe thay đổi không hoạt động. Tôi sẽ làm việc từ đây. – xmjx

+0

Đối với một số kết quả đầu ra lý do lạ cho cả stdout và stderr không được hiển thị trong trình nghe. Vì vậy, về cơ bản nó là một vấn đề gỡ lỗi. Cảm ơn một lần nữa. – xmjx

1

tôi đã sử dụng HierarchyBoundsListener để phát hiện những thay đổi về kích thước của JScrollPane:

onAncestorResized(scroll, evt -> resizeYourImages()); 

Dưới đây là một phương pháp thuận tiện để gắn người nghe:

static void onAncestorResized(JComponent component, Consumer<HierarchyEvent> callback) { 
    component.addHierarchyBoundsListener(new HierarchyBoundsAdapter() { 
     @Override 
     public void ancestorResized(HierarchyEvent e) { 
      callback.accept(e); 
     } 
    }); 
} 
Các vấn đề liên quan