Java 当用户不触摸JScrollPane时隐藏JScrollPane的滚动条
此应用程序适用于触摸面板。 我只需要当用户触摸JScrollPane区域时,JScrollPane的滚动条才可见 我不熟悉GUI和swing。这将是有益的,什么是事情,我不理解或请提供链接,如果这个问题已经在不同的论坛上提出 编辑1 由于@gthanop的第一条建议没有影响,我想更具体一些 我的jscrollPane拥有一个面板,动态填充子面板。所以,重点应该放在这个小组上 编辑2 @gthanop的edit1答案有效,但它只在面板(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视口的视图设置为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我认为我们需要你的一些代码,以便理解你在追求什么。你可以更新你的问题。如果您希望将鼠标悬停在面板上以显示滚动条,那么这是一个不同的要求,我将更新我的答案并通知您。