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



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

我是 GUI 和摇摆的新手。这将是有帮助的,什么是事情,我无法理解,或者如果这个问题在不同的论坛中被问到,请提供链接。

编辑 1

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

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

编辑 2

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

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

您可以通过方法调用中的正确参数设置每个滚动条是否可见setHorizontalScrollBarPolicysetVerticalScrollBarPolicyonJScrollPane

您可以在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外部时,滚动条将消失。

相关内容

  • 没有找到相关文章

最新更新