当用户不触摸 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
的内容中,或者更准确地说,在 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
的 Viewport
视图中消失,滚动条将隐藏。之后,当您在 JTextArea
(在本例中是 JScrollPane
的 Viewport
的视图组件)内单击返回时,焦点将在其中重新获得,因此您只需显示带有适当方法调用的滚动条。
编辑 1
正如我从这个答案的评论中了解到的,当用户将鼠标悬停在 JScrollPane
的 Viewport
的视图上时,您需要显示滚动条。如果是这样,在这种情况下,您可以像这样向视图添加 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
之外时,滚动条将消失。
此应用程序适用于触摸屏。 我只需要 JScrollPane 的滚动条只有在用户触摸 JScrollPane 区域时才可见。
我是 GUI 和 swing 的新手。这将很有帮助,我不明白是什么,或者如果在不同的论坛上有人问过这个问题,请提供链接。
编辑 1
由于@gthanop 的第一个建议没有效果,我想更具体一些。
我的 jscrollPane 包含一个动态填充子面板的面板。所以,重点应该放在这个面板上。
编辑 2
@gthanop 的 edit1 答案有效,但它仅适用于面板(jscrollPane 视口的视图)。当我悬停或单击填充在同一面板上的子面板时,滚动条会禁用。
那么,如何将 jscrollPane 视口的视图设置为 jpanel 及其内容? (虽然这可能是不同的问题)
您可以在 setHorizontalScrollBarPolicy
and setVerticalScrollBarPolicy
on the JScrollPane
.
您可以在 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);
}
}
当您单击弹出框的按钮时,焦点将从 JScrollPane
的 Viewport
视图中消失,滚动条将隐藏。之后,当您在 JTextArea
(在本例中是 JScrollPane
的 Viewport
的视图组件)内单击返回时,焦点将在其中重新获得,因此您只需显示带有适当方法调用的滚动条。
编辑 1
正如我从这个答案的评论中了解到的,当用户将鼠标悬停在 JScrollPane
的 Viewport
的视图上时,您需要显示滚动条。如果是这样,在这种情况下,您可以像这样向视图添加 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
之外时,滚动条将消失。