Как сделать так, чтобы JScrollPane отображался с JTextArea? - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь создать пользовательский интерфейс для просмотра рецептов из кулинарной книги, хранящейся на компьютере. Частью этой вкладки является JScrollPanel, в которой хранится область JTextArea, которая отображает доступные рецепты. Все вызываемые функции работают по назначению (например, allRecipes () правильно возвращает строку с доступными рецептами); однако сама панель прокрутки не отображается. Он добавляется к фрейму, как я вижу по маленькому серому блоку на месте панели, но он не заполняется должным образом. Код выглядит следующим образом:

//First panel, buttons to limit displayed recipes
    JPanel pane1 = new JPanel();
    JButton all = new JButton("All");
    JButton makeable = new JButton("Makeable");
    JTextField search = new JTextField("", 10);
    JButton searchButton = new JButton("Search Ingredient");

    //Second panel, display of recipes
    JPanel pane2 = new JPanel();
    JTextArea recipes = new JTextArea(allRecipes());
    JLabel list = new JLabel("List of Recipes:");
    JScrollPane scroll = new JScrollPane(recipes);

    //Third panel, options to add recipe and view specific recipe
    JPanel pane3 = new JPanel();
    JButton add = new JButton("Add Recipe");
    JTextField view = new JTextField("", 10);
    JButton viewButton = new JButton("View Recipe");

    //Central method
    public Recipes() {

        //basic UI stuff
        super("Recipes");
        setSize(475,350);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        FlowLayout flo = new FlowLayout();
        setLayout(flo);

        //add pane 1
        pane1.add(all);
        pane1.add(makeable);
        pane1.add(search);
        pane1.add(searchButton);
        pane1.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
        add(pane1);

        //add pane 2
        pane2.add(list);
        scroll.setPreferredSize(new Dimension(10,15));
        scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        pane2.add(scroll, BorderLayout.CENTER);
        pane2.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
        add(pane2);

        //add pane 3
        pane3.add(add);
        pane3.add(view);
        pane3.add(viewButton);
        add(pane3);

        //start up the UI
        setVisible(true);
    }

1 Ответ

0 голосов
/ 27 мая 2020
JTextArea recipes = new JTextArea(allRecipes());

Мы не знаем, что делает allRecipes(), но я предполагаю, что он устанавливает текст текстовой области.

Вместо этого вы должны определить текстовую область с помощью строк / столбцов, которые вы используете. sh. Что-то вроде:

JTextArea recipes = new JTextArea(5, 30);

, тогда в конструкторе вы должны добавить текст:

recipes.setText( allRecipes() );

Вы НЕ должны пытаться установить предпочтительный размер панели прокрутки. Предпочтительный размер будет автоматически определяться из предпочтительного размера текстовой области, который рассчитывается на основе строк / столбцов, предоставленных в конструкторе.

//scroll.setPreferredSize(new Dimension(10,15));

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

pane2.add(scroll, BorderLayout.CENTER); 

Диспетчером компоновки по умолчанию для JPanel является FlowLayout. Таким образом, вы не можете просто использовать ограничение BorderLayout при добавлении компонента.

...