Полоса прокрутки Java-апплета

#java #applet

#java #апплет

Вопрос:

[Спасибо за ответы. Это для васhttp://www.youtube.com/watch?v=Vo0Cazxj_yc ] Это может и должно быть очень простым вопросом, но я не смог найти решение.

У меня есть Java-апплет, и мне нужна вертикальная полоса прокрутки, чтобы я мог загружать тысячи кнопок в апплет и использовать полосу прокрутки для просмотра кнопок внизу апплетапрямо сейчас это выглядит так.

Кнопки используются для выбора элементов. если кнопка нажата, элемент выбран.

Когда я загружаю кнопки, все они отображаются на одном экране, сжатые вместе, чтобы соответствовать ширине и высоте экрана (~ 1000 пикселей, ~ 1000 пикселей). Приведенный ниже код является частью моей программы. Пожалуйста, прокомментируйте.

     JFrame frame = new JFrame();
    NameClassifier nameClassifier = new NameClassifier();
    JScrollPane scrollPane = new JScrollPane(nameClassifier);
     scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    frame.add(scrollPane);
    frame.getContentPane().add(nameClassifier);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
    System.out.println("exiting");
  

Комментарии:

1. Для лучшей помощи раньше. опубликуйте SSCCE . Обратите внимание, что я выполнил SSCCE из ваших фрагментов примерно в 35 строках кода.

2. Кстати, почему вы постоянно ссылаетесь на «апплет», когда в коде используется «фрейм»?

3. «тысячи кнопок .. используются для выбора элементов». Похоже, что она лучше подходит для JList компонента с включенным множественным выбором.

4. Эндрю, ты прав, мне следовало добавить часть NameClassifier. Кроме того, это первый раз, когда мне пришлось использовать апплеты, я не знаю разницы между ними и фреймами

5. Апплет (обычно) встроен в веб-страницу. Frame Или JFrame свободно перемещается на рабочем столе. Я настоятельно рекомендую вам избегать апплетов, если это вообще возможно.

Ответ №1:

 import java.awt.*;
import javax.swing.*;

class ManyButtons {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                NameClassifier nameClassifier = new NameClassifier();
                JScrollPane scrollPane = new JScrollPane(nameClassifier);
                scrollPane.setVerticalScrollBarPolicy(
                    ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
                frame.add(scrollPane);
                // nameClassifier has already been added to the scroll pane.
                //frame.getContentPane().add(nameClassifier);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
                System.out.println("exiting");
            }
        });
    }
}

class NameClassifier extends JPanel {

    NameClassifier() {
        super(new GridLayout(0,10,2,2));
        for (int ii=1; ii<=1000; ii  ) {
            add(new JButton("Button "   ii));
        }
    }
}
  

Ответ №2:

Я думаю, вы хотите использовать макет переноса.

Ответ №3:

Не добавляйте ничего непосредственно во фрейм, поэтому

 frame.add(scrollPane);
  

неверно.

Добавьте элементы в панель содержимого. вероятно

 scrollPane.add(nameClassifier);
frame.getContentPane().add(scrollPane);
  

кстати, это один симпатичный графический интерфейс. 🙂

Комментарии:

1. -1, нет ничего плохого в добавлении компонентов непосредственно во фрейм. Это поддерживается начиная с JDK5.

2. Дорогой, я бы хотел поделиться этим замечательным дизайном со всем миром, но, увы, использовать его буду только я.