当用户不触摸 JScrollpane 时隐藏 JScrollPane 的滚动条

Hide ScrollBar of the JScrollPane when user not touching JScrollpane

此应用程序适用于触摸屏。 我只需要 JScrollPane 的滚动条只有在用户触摸 JScrollPane 区域时才可见。

我是 GUI 和 swing 的新手。这将很有帮助,我不明白是什么,或者如果在不同的论坛上有人问过这个问题,请提供链接。

编辑 1

由于@gthanop 的第一个建议没有效果,我想更具体一些。

我的 jscrollPane 包含一个动态填充子面板的面板。所以,重点应该放在这个面板上。

编辑 2

@gthanop 的 edit1 答案有效,但它仅适用于面板(jscrollPane 视口的视图)。当我悬停或单击填充在同一面板上的子面板时,滚动条会禁用。

那么,如何将 jscrollPane 视口的视图设置为 jpanel 及其内容? (虽然这可能是不同的问题)

您可以在 setHorizontalScrollBarPolicy and setVerticalScrollBarPolicy on the JScrollPane.

的方法调用中通过适当的参数设置每个滚动条是否可见

您可以在 FocusListener(用于获得和失去焦点等焦点事件)中执行此操作,它将安装在 JScrollPane 的内容中,或者更准确地说,在 JScrollPaneViewport 的视图组件中(JScrollPane 正在滚动)。

以下面的代码为例:

import java.awt.Dimension;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

public class Main {
    private static void prepare(final JScrollPane scroll) {
        scroll.getViewport().getView().addFocusListener(new FocusListener() {
            @Override
            public void focusGained(final FocusEvent e) {
                scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
                scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            }

            @Override
            public void focusLost(final FocusEvent e) {
                scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
            }
        });
    }

    public static void main(final String[] args) {
        final JTextArea area = new JTextArea("Type your messages here...");

        final JScrollPane scroll = new JScrollPane(area);
        scroll.setPreferredSize(new Dimension(400, 100));

        prepare(scroll);

        final JPanel components = new JPanel();
        components.add(new JButton("Click me to change focus!"));
        components.add(scroll);

        final JFrame frame = new JFrame("Scroll auto focus.");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(components);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

当您单击弹出框的按钮时,焦点将从 JScrollPaneViewport 视图中消失,滚动条将隐藏。之后,当您在 JTextArea(在本例中是 JScrollPaneViewport 的视图组件)内单击返回时,焦点将在其中重新获得,因此您只需显示带有适当方法调用的滚动条。

编辑 1

正如我从这个答案的评论中了解到的,当用户将鼠标悬停在 JScrollPaneViewport 的视图上时,您需要显示滚动条。如果是这样,在这种情况下,您可以像这样向视图添加 MouseListener

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

public class MainMouse {
    private static void prepare(final JScrollPane scroll) {
        scroll.getViewport().getView().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(final MouseEvent e) {
                scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
                scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            }

            @Override
            public void mouseExited(final MouseEvent e) {
                scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
            }
        });
    }

    public static void main(final String[] args) {
        final JTextArea area = new JTextArea("Type your messages here...");

        final JScrollPane scroll = new JScrollPane(area);
        scroll.setPreferredSize(new Dimension(400, 100));

        prepare(scroll);

        final JPanel components = new JPanel();
        components.add(new JButton("Click me to change focus!"));
        components.add(scroll);

        final JFrame frame = new JFrame("Scroll auto focus.");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(components);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

现在,当您将鼠标悬停在 JTextArea 上时,将出现滚动条。当您将鼠标悬停在 JTextArea 之外时,滚动条将消失。