2010-04-27 3 views
0

У меня есть Jlist внутри JScrollPane, и я установил значение прототипа, так что ему не нужно вычислять ширину для больших списков, а просто использует эту ширину по умолчанию.JList с JScrollPane и значением ячейки прототипа обертывает имена элементов (заменяет точки точками вместо горизонтальной полосы прокрутки), почему?

Проблема заключается в том, что Jlist по какой-то причине заменяет конец элемента точками (...) так, что горизонтальная полоса прокрутки никогда не будет показана.

Как отключить «обертывание»? Так что длинные элементы не заменяются точками, если они шире ширины Jlist?

Я воспроизвел проблему в небольшом примере приложения. Пожалуйста, запустите его, если вы не понимаете, что я имею в виду:

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

public class Test 
{ 
    //window 
    private static final int windowWidth = 450; 
    private static final int windowHeight = 500; 

    //components 
    private JFrame frame; 
    private JList classesList; 
    private DefaultListModel classesListModel; 

    public Test() 
    { 
     load(); 
    } 

    private void load() 
    { 
     //create window 
     frame = new JFrame("Test"); 
     frame.setSize(windowWidth, windowHeight); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setUndecorated(true); 
     frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG); 

     //classes list 
     classesListModel = new DefaultListModel(); 
     classesList = new JList(classesListModel); 
     classesList.setPrototypeCellValue("prototype value"); 
     classesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     classesList.setVisibleRowCount(20); 
     JScrollPane scrollClasses = new JScrollPane(classesList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);  

     for (int i = 0; i < 200; i++) 
     { 
      classesListModel.addElement("this is a long string, does not fit in width"); 
     } 

     //panel 
     JPanel drawingArea = new JPanel(); 
     drawingArea.setBackground(Color.white); 

     drawingArea.add(scrollClasses); 
     frame.add(drawingArea); 

     //set visible 
     frame.setVisible(true); 
    } 
} 

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

Заранее спасибо.

ответ

3

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

Используя метод setPrototypeCellValue (...), вы влияете на то, как список вычисляет его предпочтительный размер, а это означает, что вы несете ответственность за предоставление правильного значения, которое гарантирует, что строки не будут усечены.

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

+0

Как бы я установил предпочтительный размер тогда? Я думал, что это делает setPrototypecellValue? – Tom

+1

Получил его сейчас, используя scrollClasses.setPreferredSize (новое измерение (100, 400)) ;. Благодарю. – Tom

+0

См. Мой ответ ниже. Кроме того, если вы не вызываете setPrototypecellValue(), он автоматически настраивает размер JList для размещения самого широкого элемента. setPrototypecellValue() полезен, если у вас очень длинный список, и вы не хотите, чтобы Java просматривала каждую запись, чтобы найти требования к ширине. – Alinium

1

Когда вы звоните classesList.setPrototypeCellValue("prototype value"), вы сообщаете JListclassesList, чтобы ограничить его максимальную ширину длиной строки «значение прототипа». (See javadocs)

Затем, когда вы заполняете список строками «это длинная строка, не вписывается в ширину», неудивительно, что она не вписывается в ширину! Поскольку ширина прототипа, которую вы дали, меньше ширины строки, которую вы заполняете.

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

Если закомментировать

classesList.setPrototypeCellValue("prototype value");

или заменить его

classesList.setPrototypeCellValue("this is a long string, does not fit in width");

тогда он будет функционировать, как вы ожидали.

+0

Спасибо, camickr был немного быстрее, но вы заслуживаете повышения для дополнительной разработки! Кстати, я читал документы, но, я думаю, я неправильно понял это. :) – Tom

2

Мой ответ на этот вопрос в том, что сначала найти самый длинный элемент в списке, то используйте метод setPrototype на том, что элементы

 Смежные вопросы

  • Нет связанных вопросов^_^