gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:53:17 26 4
gpt4 key购买 nike

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

我是 GUI 和 swing 的新手。这会很有帮助,我不明白是什么,或者如果在其他论坛中提出了这个问题,请提供链接。

编辑 1

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

我的 jscrollPane 拥有一个动态填充子面板的面板。因此,焦点应该是这个面板。

编辑2

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

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

最佳答案

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

您可以在 FocusListener 内执行此操作(用于焦点事件,例如获得和失去焦点时)将安装在 JScrollPane 的内容中,或者更准确地说,安装在 JScrollPane 中的 Viewport 的 View 组件(这是 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 View 中消失,并且滚动条将隐藏。之后,当您在 JTextArea(本例中是 JScrollPaneViewport 的 View 组件)内单击返回时,焦点将在其中重新获得,因此您只需使用适当的方法调用来显示滚动条即可。

编辑 1

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

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

关于java - 当用户不触摸 JScrollpane 时隐藏 JScrollPane 的 ScrollBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59698740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com