Получение полос прокрутки всегда на панели прокрутки

У меня есть две панели прокрутки, которые я пытаюсь настроить так, чтобы полосы прокрутки всегда были видны. По какой-то причине, когда я пытаюсь использовать приведенный ниже код (код прокрутки), я получаю сообщение об ошибке: «Метод setHorizontalScrollBarPolicy (int) не определен для типа JTextPane». Какие-либо предложения?

Код прокрутки:

scrollPane.setHorizontalScrollBarPolicy(
   JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(
   JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

Код, в котором я создаю панели прокрутки:

JPanel ScrollPanes = new JPanel();
frame.getContentPane().add(ScrollPanes, BorderLayout.CENTER);
ScrollPanes.setLayout(new GridLayout(0, 2, 0, 0));

JTextPane textPane_0 = new JTextPane();
ScrollPanes.add(textPane_0);
textPane_0.setHorizontalScrollBarPolicy(
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
textPane_0.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

JTextPane textPane_1 = new JTextPane();
ScrollPanes.add(textPane_1);

Полный код:

package swing;

import java.awt.EventQueue;

public class Swing {

    private JFrame frame;
    private JTextField textField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Swing window = new Swing();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Swing() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 600, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel TopApps = new JPanel();
        frame.getContentPane().add(TopApps, BorderLayout.NORTH);
        TopApps.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));


        JComboBox comboBox = new JComboBox();
        comboBox.setPreferredSize(new Dimension(100, 20));
        TopApps.add(comboBox);

        textField = new JTextField();
        TopApps.add(textField);
        textField.setColumns(20);

        JScrollPane scrollPanes = new JScrollPane();
        frame.getContentPane().add(scrollPanes, BorderLayout.CENTER);
        scrollPanes.setLayout(new GridLayout(0, 2, 0, 0));

        JTextPane textPane_0 = new JTextPane();
        scrollPanes.add(textPane_0);
        textPane_0.setBorder(BorderFactory.createLoweredBevelBorder());
        scrollPanes.setHorizontalScrollBarPolicy(
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            scrollPanes.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        JTextPane textPane_1 = new JTextPane();
        scrollPanes.add(textPane_1);
        textPane_1.setBorder(BorderFactory.createLoweredBevelBorder());
        scrollPanes.setHorizontalScrollBarPolicy(
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            scrollPanes.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        JPanel bottomPanel = new JPanel();
        frame.getContentPane().add(bottomPanel, BorderLayout.SOUTH);
        bottomPanel.setLayout(new GridLayout(2, 1, 5, 0));
        bottomPanel.setBorder(BorderFactory.createLoweredBevelBorder());

        JTextPane bText = new JTextPane();
        bottomPanel.add(bText);
        bText.setBorder(BorderFactory.createLoweredBevelBorder());

        JLabel status = new JLabel("Status");
        bottomPanel.add(status);
        status.setHorizontalAlignment(JLabel.CENTER);

    }

}

person Kevin Schultz    schedule 26.06.2014    source источник


Ответы (2)


textPane_0 является экземпляром JTextPane, а не JScrollPane, поэтому у него нет метода setHorizontalScrollBarPolicy.

Вы, вероятно, захотите обернуть свои textPane_0 и textPane_1 в новые экземпляры JScrollPane, установить его свойства полосы прокрутки и добавить их в свой фрейм.

Другими словами, используйте

JTextPane textPane_0 = new JTextPane();
JScrollPane jScrollPane1 = new JScrollPane(textPane_0);//warp text pane
//and set properties of wrapper
jScrollPane1.setHorizontalScrollBarPolicy(
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
jScrollPane1.setVerticalScrollBarPolicy(
        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
ScrollPanes.add(jScrollPane1);


JTextPane textPane_1 = new JTextPane();
JScrollPane jScrollPane2 = new JScrollPane(textPane_1);
jScrollPane2.setHorizontalScrollBarPolicy(
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
jScrollPane2.setVerticalScrollBarPolicy(
        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
ScrollPanes.add(jScrollPane2);

ДЕМО:

class Demo {
    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500,400);

        JPanel ScrollPanes = new JPanel();
        frame.getContentPane().add(ScrollPanes, BorderLayout.CENTER);
        ScrollPanes.setLayout(new GridLayout(0, 2, 0, 0));

        JTextPane textPane_0 = new JTextPane();
        JScrollPane jScrollPane1 = new JScrollPane(textPane_0);
        jScrollPane1.setHorizontalScrollBarPolicy(
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPane1.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        ScrollPanes.add(jScrollPane1);


        JTextPane textPane_1 = new JTextPane();
        JScrollPane jScrollPane2 = new JScrollPane(textPane_1);
        jScrollPane2.setHorizontalScrollBarPolicy(
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPane2.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        ScrollPanes.add(jScrollPane2);


        frame.setVisible(true);


    }
}
person Pshemo    schedule 26.06.2014
comment
Это также дало следующую ошибку при компиляции. Я отредактировал полный код выше. . java.lang.ClassCastException: макет JScrollPane должен быть ScrollPaneLayout в javax.swing.JScrollPane.setLayout(неизвестный источник) в swing.Swing.initialize(Swing.java:78) в swing.Swing.‹init›(Swing.java :52) в swing.Swing$1.run(Swing.java:39) в java.awt.event.InvocationEvent.dispatch(неизвестный источник) в java.awt.EventQueue.dispatchEventImpl(неизвестный источник) - person Kevin Schultz; 27.06.2014
comment
Вы изменили JPanel ScrollPanes = new JPanel(); на JScrollPane ScrollPanes = new JScrollPane();? Если да, то изменение его обратно на JPanel решает вашу проблему? - person Pshemo; 27.06.2014

JPanel ScrollPanes = new JPanel();

Должно быть:

JScrollPane ScrollPanes = new JScrollPane();

Или лучше, используя правильную номенклатуру:

JScrollPane scrollPanes = new JScrollPane();

Затем измените:

textPane_0.setHorizontalScrollBarPolicy(
    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
textPane_0.setVerticalScrollBarPolicy(
    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

To:

scrollPanes.setHorizontalScrollBarPolicy(
    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPanes.setVerticalScrollBarPolicy(
    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
person Andrew Thompson    schedule 26.06.2014
comment
Добавление, которое казалось правильным, но дало следующую ошибку при компиляции. Я отредактировал полный код выше. . java.lang.ClassCastException: макет JScrollPane должен быть ScrollPaneLayout в javax.swing.JScrollPane.setLayout(неизвестный источник) в swing.Swing.initialize(Swing.java:78) в swing.Swing.‹init›(Swing.java :52) в swing.Swing$1.run(Swing.java:39) в java.awt.event.InvocationEvent.dispatch(неизвестный источник) в java.awt.EventQueue.dispatchEventImpl(неизвестный источник) - person Kevin Schultz; 27.06.2014