Mam JLabel, na którym jest dużo tekstu. Czy istnieje sposób, aby JLabel miał maksymalną szerokość, tak aby zawijał tekst, aby nie przekraczał tej szerokości?
Dzięki
Mam JLabel, na którym jest dużo tekstu. Czy istnieje sposób, aby JLabel miał maksymalną szerokość, tak aby zawijał tekst, aby nie przekraczał tej szerokości?
Dzięki
Odpowiedzi:
Nie.
Możesz użyć HTML w etykiecie, ale wtedy musisz na stałe zakodować znacznik break.
Lepszym podejściem jest użycie JTextArea i włączenie zawijania. Możesz zmienić tło, pierwszy plan, czcionkę itp. Tekstu, aby wyglądał jak etykieta.
Uwaga, ta odpowiedź jest nieaktualna przynajmniej od wersji Java 7.
Zgodnie z odpowiedzią @ darren, wystarczy owinąć ciąg tagami
<html>
i</html>
:myLabel.setText("<html>"+ myString +"</html>");
Nie musisz na stałe kodować żadnych znaczników przerwania. Tekst zawija się wraz ze zmianą rozmiaru komponentu.
źródło
Tak, są dwa podobne sposoby (pierwszy ze stylem css = "width: ... px", drugi z html WIDTH = .......:
1.
labelText = String.format("<html><div style=\"width:%dpx;\">%s</div></html>", width, text);
2.
labelText = String.format("<html><div WIDTH=%d>%s</div></html>", width, text);
źródło
</html>
btw :)lub po prostu użyj
myLabel.setText("<html>"+ myString +"</html>");
źródło
JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
myString
są najpierw chronione. JeślimyString
jest coś w rodzaju „Wartość <5”, pojawi się jako „Wartość 5”.Możesz używać HTML bez znaczników przerwania kodowania, jeśli zamiast tego używasz znaczników akapitu.
JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");
źródło
JXLabel w projekcie SwingX obsługuje zawijanie
JXLabel label = new JXLabel(somelongtext); label.setLineWrap(true);
źródło
Jest to dobra technika tutaj , przewiń do końca artykułu.
JLabel labelBeingUsed = myLabel; View view = (View) labelBeingUsed.getClientProperty(BasicHTML.propertyKey); view.setSize(scrollPane1.getWidth(), 0.0f); float w = view.getPreferredSpan(View.X_AXIS); float h = view.getPreferredSpan(View.Y_AXIS); labelBeingUsed.setSize((int) w, (int) h);
źródło
Oprócz zawijania tekstu w
<html>
znaczniki, musisz również umieścić etykietę w pojemniku, który przestrzega preferowanej wysokości i ustawia szerokość na maksimum. Na przykład możesz umieścić etykietę na PÓŁNOCNEJ części plikuBorderLayout
.Oto prosty, ale kompletny program roboczy, który to ilustruje. Możesz zmienić rozmiar ramki w dowolny sposób; etykieta zajmie całą szerokość, a wysokość dostosuje się odpowiednio, aby zawinąć tekst. Zauważ, że wszystko, co robię, to używanie
<html>
tagów i umieszczanie etykiety w PÓŁNOCNEJ częściBorderLayout
.import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.JPanel; import javax.swing.JLabel; import java.awt.BorderLayout; import java.awt.Dimension; public class LabelWrap { public static JPanel createPanel() { JLabel label = new JLabel(); label.setText("<html>" + "<h3>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h3>" + "<p>Duis a tincidunt urna. Phasellus tristique interdum mauris, " + "ut vestibulum purus suscipit eget. Aenean massa elit, accumsan " + "non faucibus vel, dictum placerat urna. In bibendum est sagittis " + "urna iaculis quis sagittis velit commodo. Cum sociis natoque " + "penatibus et magnis dis parturient montes, nascetur ridiculus " + "mus. Nam quis lacus mauris. Phasellus sem libero, convallis " + "mattis sagittis vel, auctor eget ipsum. Vivamus molestie semper " + "adipiscing. In ac neque quis elit suscipit pharetra. Nulla at " + "orci a tortor consequat consequat vitae sit amet elit. Praesent " + "commodo lacus a magna mattis vehicula. Curabitur a hendrerit " + "risus. Aliquam accumsan lorem quis orci lobortis malesuada.</p>" + "<p>Proin quis viverra ligula. Donec pulvinar, dui id facilisis " + "vulputate, purus justo laoreet augue, a feugiat sapien dolor ut " + "nisi. Sed semper augue ac felis ultrices a rutrum dui suscipit. " + "Praesent et mauris non tellus gravida mollis. In hac habitasse " + "platea dictumst. Vestibulum ante ipsum primis in faucibus orci " + "luctus et ultrices posuere cubilia Curae; Vestibulum mattis, " + "tortor sed scelerisque laoreet, tellus neque consectetur lacus, " + "eget ultrices arcu mi sit amet arcu. Nam gravida, nulla interdum " + "interdum gravida, elit velit malesuada arcu, nec aliquam lectus " + "velit ut turpis. Praesent pretium magna in nibh hendrerit et " + "elementum tellus viverra. Praesent eu ante diam. Proin risus " + "eros, dapibus at eleifend sit amet, blandit eget purus. " + "Pellentesque eu mollis orci. Sed venenatis diam a nisl tempor " + "congue.</p>" + "</html>"); JPanel panel = new JPanel(new BorderLayout()); panel.add(label, BorderLayout.NORTH); panel.setPreferredSize(new Dimension(640, 480)); return panel; } /** * @param args */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(createPanel()); frame.pack(); frame.setVisible(true); } }); } }
źródło
<html>
owijanie działa, ale nie we wszystkich przypadkach. Jeśli kontener nadrzędny używa FlowLayout, to nie będzie działać. Dlatego ustawiłem to na BoxLayout. Spójrz na ten fragment kodu:javax.swing.JPanel pRefundNote = new javax.swing.JPanel(); javax.swing.JLabel lbNote = new javax.swing.JLabel(); pRefundNote.setAlignmentX(0.0F); pRefundNote.setMaximumSize(new java.awt.Dimension(32767, 33)); pRefundNote.setLayout(new javax.swing.BoxLayout(pRefundNote, javax.swing.BoxLayout.X_AXIS)); lbNote.setText("<html>Select items using Shift or Ctrl and Up/Down keys or Mouse</html>"); lbNote.setVerticalAlignment(javax.swing.SwingConstants.TOP); lbNote.setVerticalTextPosition(javax.swing.SwingConstants.TOP); pRefundNote.add(lbNote);
Nie dodawaj,
<br>
ponieważ złamie to twój tekst, nawet jeśli powiększysz ramkę nadrzędną i kontener pRefundNote.źródło
Jeśli chcesz używać tylko JLabel, możesz wypróbować to podejście,
po prostu wyświetl liczbę znaków, które chcesz wyświetlić na etykiecie, używając metody podciąg.
public void setLabel(String label){ String dispLabel=label.substring(0, numOfCharacter); labelComponent.setText(dispLabel); }
źródło