2011-11-19 12 views
8

Mam JList z bardzo długimi nazwami przedmiotów, które powodują pojawienie się poziomego paska przewijania w panelu przewijania.Zawijanie słów w elementach JList

Czy istnieje możliwość zawijania słów, aby cała nazwa całej pozycji pojawiła się w 2 wierszach, ale można ją wybrać jednym kliknięciem? I.E to powinno nadal być zachowywać się jako pojedynczy element, ale być wyświetlane w dwóch rzędach.


Oto co zrobiłem po obejrzeniu przykład poniżej

I dodał nową klasę do mojego MyCellRenderer projektu, a potem poszłam dodany MyList.setCellRenderer(new MyCellRenderer(80)); w kodzie tworzenia postu mojej listy. Czy jest coś jeszcze, co muszę zrobić?

+4

Użyj niestandardowego mechanizmu renderującego komórki. –

+0

Przypominam sobie, że ktoś (czy to Andrew) używał JLabel, HTML i prostych arkuszy stylów, żeby rozwiązać coś takiego. –

+0

Tak, oczywiście, był to Andrew: [istnieje-tam-niektóre-słowa-wrap-własności-of-jlabel-exist] (http://stackoverflow.com/questions/7861724/is-there-some-word- wrap-property-of-jlabel-exist/7861833 # 7861833). Wierzę, że ta koncepcja może być również używana w twoim rendererze komórek niestandardowych. –

Odpowiedz

19

Tak, przy użyciu kodu Andrzeja, wymyśliłem coś takiego:

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

public class JListLimitWidth { 
    public static void main(String[] args) { 
     String[] names = { "John Smith", "engelbert humperdinck", 
      "john jacob jingleheimer schmidt" }; 
     MyCellRenderer cellRenderer = new MyCellRenderer(80); 
     JList list = new JList(names); 
     list.setCellRenderer(cellRenderer); 
     JScrollPane sPane = new JScrollPane(list); 
     JPanel panel = new JPanel(); 
     panel.add(sPane); 
     JOptionPane.showMessageDialog(null, panel); 

    } 
} 

class MyCellRenderer extends DefaultListCellRenderer { 
    public static final String HTML_1 = "<html><body style='width: "; 
    public static final String HTML_2 = "px'>"; 
    public static final String HTML_3 = "</html>"; 
    private int width; 

    public MyCellRenderer(int width) { 
     this.width = width; 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
     int index, boolean isSelected, boolean cellHasFocus) { 
     String text = HTML_1 + String.valueOf(width) + HTML_2 + value.toString() 
      + HTML_3; 
     return super.getListCellRendererComponent(list, text, index, isSelected, 
      cellHasFocus); 
    } 

} 
+1

+1 hmmmm jak łatwo – mKorbel

+2

To nie było moje mądrość, ale zrobiłem to tutaj: [post Andrew] (http://stackoverflow.com/questions/7861724/is-there-some-word-wrap-property- of-jlabel-exist/7861833 # 7861833). Nie mogę odpowiedzieć na jego odpowiedź więcej niż jeden raz, ale zachęcam każdego, kto uważa, że ​​moja odpowiedź była pomocna w promowaniu linku. –

+0

Świetnie! Sugeruję, abyśmy obuwali oba! –

-1

Można również obliczyć dynamicznie szerokość (zamiast stałej wartości):

String text = HTML_1 + String.valueOf(**list.getWidth()**) + HTML_2 + value.toString() + HTML_3; 

Więc jeśli panel zmienia rozmiar listy, zawijanie pozostaje poprawne.

Aktualizacja

A wynik wygląda tak: enter image description here

+0

To nie działa. Jeśli rozmiar pliku JList zostanie zmieniony, wysokość wiersza nie zostanie skorygowana i pojawią się zabawne wizualne rzeczy. Zobacz mój dołączony obraz ... Dodałem zielony i czerwony, aby pomóc zilustrować. – Jason

0

Można to zrobić jeszcze łatwiejsze. Możesz utworzyć JList przez consatructor z ListModel. W CustomListModel rozszerza AbstractListModel, metoda getElementAt() może zwrócić String z tym samym tekstem sformatowanym w html. W ten sposób wykonaj to samo bez modyfikacji mechanizmu renderowania komórki.

+2

Zawijanie to interfejs użytkownika, a nie model. Zmiana modelu w celu dostosowania interfejsu użytkownika jest zła. – SurfMan

Powiązane problemy