Вы можете установить, будет ли каждая полоса прокрутки видимой через соответствующие аргументы в вызове метода setHorizontalScrollBarPolicy
и setVerticalScrollBarPolicy
в 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);
}
}
При нажатии на кнопку всплывающей рамки фокус исчезает из вида Viewport
JScrollPane
и полосы прокрутки скрываются. После этого, когда вы щелкнете обратно внутри JTextArea
(который в данном случае является JScrollPane
компонентом вида Viewport
), фокус снова будет восстановлен, поэтому вы просто показываете полосы прокрутки соответствующим методом call.
Edit 1
Как я понял из комментариев к этому ответу, вам нужно показывать полосы прокрутки, когда пользователь наводит указатель мыши на JScrollPane
s 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
полосы прокрутки исчезнут.