Câu hỏi 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?


Tôi có JScrollPane có 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.


8
2018-05-02 09:38


gốc




Các câu trả lời:


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

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();
    }
}

12
2018-05-02 09:50



Okay, kỳ lạ. 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
Đố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


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

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

Đây là một phương pháp tiện lợi để gắn trình nghe:

static void onAncestorResized(JComponent component, Consumer<HierarchyEvent> callback) {
    component.addHierarchyBoundsListener(new HierarchyBoundsAdapter() {
        @Override
        public void ancestorResized(HierarchyEvent e) {
            callback.accept(e);
        }
    });
}

1
2018-03-10 18:03