Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当用户不触摸JScrollPane时隐藏JScrollPane的滚动条_Java_Swing_Focus_Jscrollpane_Jscrollbar - Fatal编程技术网

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

Java 当用户不触摸JScrollPane时隐藏JScrollPane的滚动条,java,swing,focus,jscrollpane,jscrollbar,Java,Swing,Focus,Jscrollpane,Jscrollbar,此应用程序适用于触摸面板。 我只需要当用户触摸JScrollPane区域时,JScrollPane的滚动条才可见 我不熟悉GUI和swing。这将是有益的,什么是事情,我不理解或请提供链接,如果这个问题已经在不同的论坛上提出 编辑1 由于@gthanop的第一条建议没有影响,我想更具体一些 我的jscrollPane拥有一个面板,动态填充子面板。所以,重点应该放在这个小组上 编辑2 @gthanop的edit1答案有效,但它只在面板(jscrollPane视口的视图)上有效。当我悬停或单击子面板

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

我不熟悉GUI和swing。这将是有益的,什么是事情,我不理解或请提供链接,如果这个问题已经在不同的论坛上提出

编辑1

由于@gthanop的第一条建议没有影响,我想更具体一些

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

编辑2

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


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

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

您可以在将安装在
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);
    }
}
单击弹出框架的按钮时,焦点将从
JScrollPane
视口视图中消失,滚动条将隐藏。之后,当您在
JTextArea
(在本例中是
JScrollPane
Viewport
的视图组件)内单击后退时,焦点将在其中重新获得,因此您只需使用适当的方法调用显示滚动条

编辑1 我从这个答案的注释中了解到,当用户将鼠标悬停在
JScrollPane
视口
的视图上时,需要显示滚动条。如果是,在这种情况下,可以向视图中添加一个,如下所示:

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
之外时,滚动条将消失。

首先,感谢您的回复。我明白你的意思。它应该有用,但没有运气,兄弟@AnandNarayan你是说它不起作用?我在发布前测试了它。它对我有用。现在也测试过了。您只需在JTextArea内单击以获得焦点(如果滚动条尚未显示,则滚动条将显示),然后单击按钮以从JTextArea失去焦点(这将使滚动条消失)。我将更清楚地了解我的应用程序。实际上,我有一个滚动窗格,其视图设置为jpanel,它由动态填充的各种子面板组成。但是建议的焦点侦听器在这种情况下不起作用。我假设悬停在面板上也会抓住焦点。不管怎样,我甚至还试着点击面板。但还是没有运气@AnandNarayan我认为我们需要你的一些代码,以便理解你在追求什么。你可以更新你的问题。如果您希望将鼠标悬停在面板上以显示滚动条,那么这是一个不同的要求,我将更新我的答案并通知您。