Установите сумму строк шоу JList (Java)

Проблема: у Меня есть метод, который создает список из проанализированного ArrayList. Мне удается показать список в GUI без полосы прокрутки. Однако у меня есть проблема при установке его для показа только размера ArrayList. Значение, говорят, равняется ли размер 6, в показанном Списке должно только быть 6 строк. Ниже код, который я использую. Я пытался установить visibleRowCount как ниже, но это не работает. Я пытался распечатать результат, и он показывает, что изменение внесено.

private void createSuggestionList(ArrayList str) {
    int visibleRowCount = str.size();
    System.out.println("visibleRowCount " + visibleRowCount);
    listForSuggestion = new JList(str.toArray());
    listForSuggestion.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    listForSuggestion.setSelectedIndex(0);
    listForSuggestion.setVisibleRowCount(visibleRowCount);
    System.out.println(listForSuggestion.getVisibleRowCount());
    listScrollPane = new JScrollPane(listForSuggestion);
    MouseListener mouseListener = new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent mouseEvent) {
            JList theList = (JList) mouseEvent.getSource();
            if (mouseEvent.getClickCount() == 2) {
                int index = theList.locationToIndex(mouseEvent.getPoint());
                if (index >= 0) {
                    Object o = theList.getModel().getElementAt(index);
                    System.out.println("Double-clicked on: " + o.toString());
                }
            }
        }
    };
    listForSuggestion.addMouseListener(mouseListener);
    textPane.add(listScrollPane);
    repaint();
}

Подводить итог: Я хочу, чтобы JList показал столько же строк сколько размер проанализированного ArrayList без полосы прокрутки.

Вот изображение проблемы:

jlist 1

Вот ссылка на другие 2, поскольку разрешение изображения является довольно большим, я боюсь, это исказит представление:

JList 1 и JList 2

JList 1 и 2 изображения показывают его ясно. JList отображает пустые строки, которые я не хочу, чтобы он произошел.

Какие-либо идеи? Помогите.Спасибо. Сообщите мне, необходимо ли изображение проблемы в случае, если я не формулировал свой вопрос правильно.

--

Править:

JScrollPane scrollPane = new JScrollPane(textPane);
scrollPane.setPreferredSize(new Dimension(200, 200));

//Create the text area for the status log and configure it.
changeLog = new JTextArea(5, 30);
changeLog.setEditable(false);
JScrollPane scrollPaneForLog = new JScrollPane(changeLog);

//Create a split pane for the change log and the text area.
JSplitPane splitPane = new JSplitPane(
        JSplitPane.VERTICAL_SPLIT,
        scrollPane, scrollPaneForLog);
splitPane.setOneTouchExpandable(true);

//Create the status area.
JPanel statusPane = new JPanel(new GridLayout(1, 1));
CaretListenerLabel caretListenerLabel =
        new CaretListenerLabel("Caret Status");
statusPane.add(caretListenerLabel);

//Add the components.
getContentPane().add(splitPane, BorderLayout.CENTER);
getContentPane().add(statusPane, BorderLayout.PAGE_END);

Как textPane включен в контейнер, если это помогает

Другое редактирование:

public void showSuggestionList(JScrollPane pane, Rectangle caretCoords) {
    pane.setVisible(false);
    pane.setBounds(caretCoords.x - 5, caretCoords.y + 25, 400, 250);
    pane.setVisible(true);
    repaint();
}

showSuggestionList () называют моим CaretListener, для показа JScrollPane, когда каре перемещается.

8
задан Adaline Simonian 13 August 2017 в 09:39
поделиться

2 ответа

Я подозреваю, что это управление макетом textPane , вот в чем проблема. Насколько я могу судить, список listForSuggestions не должен занимать больше места, чем необходимо для отображения этих элементов, если соблюдается его предпочтительный размер.

Итак, JTextPane является Контейнером , то есть к нему можно добавлять подкомпоненты. Но как расположены эти подкомпоненты? Это зависит от используемого в настоящее время менеджера по расположению. Если менеджер по расположению соблюдает предпочтительный размер listForSuggestios , я думаю, все будет в порядке. Хотя не уверен.

Из того, что я вижу, вы можете получить "нулевой макет", просто создав экземпляр JTextPane , что означает, что если вы явно не настроите другой диспетчер макета, вам нужно будет позаботиться о размещении / изменении размера компонентов самостоятельно.

Вы можете попробовать сделать что-то вроде

Dimension dim = listForSuggestions.getPreferredSize();
listForSuggestions.setBounds(xPos, yPos, dim.getWidth(), dim.getHeight());

Вот полный пример

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.*;


public class FrameTest {

    public static void main(String[] args) {
        JFrame f = new JFrame("Frame Test");


        ArrayList<String> str = new ArrayList<String>();
        for (int i = 0; i < 20; i++)
            str.add("number " + i);

        JTextPane tp = new JTextPane();


        int visibleRowCount = str.size();
        System.out.println("visibleRowCount " + visibleRowCount);
        JList listForSuggestion = new JList(str.toArray());
        listForSuggestion.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listForSuggestion.setSelectedIndex(0);
        listForSuggestion.setVisibleRowCount(5);
        System.out.println(listForSuggestion.getVisibleRowCount());
        JScrollPane listScrollPane = new JScrollPane(listForSuggestion);
        MouseListener mouseListener = new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent mouseEvent) {
                JList theList = (JList) mouseEvent.getSource();
                if (mouseEvent.getClickCount() == 2) {
                    int index = theList.locationToIndex(mouseEvent.getPoint());
                    if (index >= 0) {
                        Object o = theList.getModel().getElementAt(index);
                        System.out.println("Double-clicked on: " + o.toString());
                    }
                }
            }
        };
        listForSuggestion.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
        listForSuggestion.addMouseListener(mouseListener);
        Dimension dim = listForSuggestion.getPreferredSize();
        listForSuggestion.setBounds(20, 20, (int) dim.getWidth(), (int) dim.getHeight());

        tp.add(listForSuggestion);

        f.add(tp);
        f.setSize(400, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);

    }
}

Я думаю, что самый элегантный способ сделать это - развернуть свой собственный менеджер компоновки. (На самом деле это довольно просто.) И затем вместо выполнения textPane.add (list) вы выполняете textPane.add (list, YourLayoutManager.POPUP_LIST) . Затем менеджер по расположению запоминает тот факт, что список должен был быть размещен в соответствии с его предпочтительным размером, и размещает его соответствующим образом в своем методе layoutContainer . (Если вы дадите YourLayoutManager ссылку на JTextPane , к которой он прикреплен, вы, вероятно, даже сможете разместить его в списке рядом с текущим местоположением каретки .)

2
ответ дан 6 December 2019 в 00:54
поделиться

Если вы динамически (с помощью кода) заполняете свой список, не использовать полосу прокрутки - плохая идея. Это может работать так, как вы хотите, например. для 20 элементов списка, но представьте, что произойдет, когда вам понадобится использовать больше данных - например, 2000. Ваш графический интерфейс будет испорчен.

1
ответ дан 6 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: