Скрыть панель прокрутки JScrollPane, когда пользователь не касается JScrollPane - PullRequest
0 голосов
/ 12 января 2020

Это приложение для сенсорной панели. Мне просто нужна полоса прокрутки JScrollPane, видимая только тогда, когда пользователь касается области JScrollPane.

Я новичок в GUI и свинг. Будет полезно, в чем дело, я не понимаю или, пожалуйста, предоставьте ссылки, если этот вопрос был задан на другом форуме.

Изменить 1

Поскольку первое предложение @gthanop не дало никакого эффекта, я бы хотел быть более точным c.

Мой jscrollPane содержит панель, которая динамически заполняет подпанели. Таким образом, фокус должен быть на этой панели.

Edit 2

Ответ @gthanop edit1 сработал, но он работает только на панели (представление окна просмотра jscrollPane). Полоса прокрутки отключается при наведении курсора мыши или щелчке на вспомогательной панели, которая заполняется на той же панели.

Итак, как настроить представление окна просмотра jscrollPane для jpanel, а также ее содержимое? (Это может быть другой вопрос, хотя)

1 Ответ

0 голосов
/ 12 января 2020

Вы можете установить, будет ли каждая полоса прокрутки видимой через соответствующие аргументы в вызове метода 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 полосы прокрутки исчезнут.

...