此应用程序适用于触摸屏。 我只需要JScrollPane的滚动条仅在用户触摸JScrollPane区域时才可见。
我是 GUI 和摇摆的新手。这将是有帮助的,什么是事情,我无法理解,或者如果这个问题在不同的论坛中被问到,请提供链接。
编辑 1
由于@gthanop的第一个建议没有效果,我想更具体一些。
我的 jscrollPane 包含一个动态填充子面板的面板。因此,重点应该放在这个面板上。
编辑 2
@gthanop的 edit1 答案有效,但它仅适用于面板(jscrollPane 视口的视图(。当我悬停或单击填充在同一面板上的子面板时,滚动条将禁用。
那么,如何将 jscrollPane 视口的视图设置为 jpanel 及其内容呢?(不过这可能是不同的问题(
您可以通过方法调用中的正确参数设置每个滚动条是否可见setHorizontalScrollBarPolicy
和setVerticalScrollBarPolicy
onJScrollPane
。
您可以在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
外部时,滚动条将消失。