Проблема: у Меня есть метод, который создает список из проанализированного 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 без полосы прокрутки.
Вот изображение проблемы:
Вот ссылка на другие 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, когда каре перемещается.
Я подозреваю, что это управление макетом 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
, к которой он прикреплен, вы, вероятно, даже сможете разместить его в списке
рядом с текущим местоположением каретки .)
Если вы динамически (с помощью кода) заполняете свой список, не использовать полосу прокрутки - плохая идея. Это может работать так, как вы хотите, например. для 20 элементов списка, но представьте, что произойдет, когда вам понадобится использовать больше данных - например, 2000. Ваш графический интерфейс будет испорчен.