当用户不触摸JScrollpane时隐藏JScrollPane的ScrollBar

问题描述 投票:0回答:1

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

我是GUI的新手,正在摇摆。如果您以其他形式提出的问题,我看不懂什么是有用的,或者请提供链接。

java swing focus jscrollpane jscrollbar
1个回答
0
投票

您可以通过setHorizontalScrollBarPolicy上的setVerticalScrollBarPolicyJScrollPane的方法调用中的适当参数设置每个滚动条是否可见。

您可以在FocusListener内部执行此操作(这是针对焦点事件,例如获得焦点和失去焦点的事件),该事件将安装在JScrollPane的内容中,或更准确地说,将安装在JScrollPane中]的Viewport的视图组件(即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);
    }
}

当您单击弹出的框的按钮时,焦点将从ViewportJScrollPane的视图中丢失,并且滚动条将隐藏。之后,当您在JTextArea(在本例中为JScrollPaneViewport的视图组件)内部单击时,将重新获得焦点,因此只需使用适当的方法显示滚动条致电。

© www.soinside.com 2019 - 2024. All rights reserved.