Ein JLabel mit HTML-Text umschließt Linien automatisch mit dem verfügbaren Platz. Wenn man JLabel zu einem JSrollPane hinzufügt, muss er preferredSize auf einen vernünftigen Wert setzen, sonst wird es nicht umbrochen. All dies sollte mit anderen Komponenten in einem JPanel funktionieren, die einen LayoutManager verwenden.JLabel mit eingebundenem HTML-Text als JScrollPane-Client
Ursache Ich möchte ein in der Größe veränderbares Anwendungsfenster Ich erweiterte JScrollPane, um die Größenänderungsereignisse zu verfolgen und die Größe synchron zur Breite des Ansichtsfensters zu ändern. Grundsätzlich funktioniert es, aber manchmal ist die Berechnung der bevorzugten Höhe durch den Layout-Manager falsch (Wert zu groß oder zu klein). Zum Beispiel zeigt die Sichtbarkeit des roten Randes, der durch die erste Linie schneidet, an, dass die Berechnung der Höhe falsch ist.
ich den Fehler mit einer einzigen Verpackung JLabel nicht wiedergeben kann.
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class WrappedLabel implements Runnable {
public static void main(String[] args){
SwingUtilities.invokeLater(new WrappedLabel());
}
@Override
public void run(){
final JPanel panel = new JPanel(new GridBagLayout());
final GridBagConstraints gc = new GridBagConstraints();
gc.fill = GridBagConstraints.BOTH;
gc.weightx = 1.0;
gc.weighty = 1.0;
{
gc.gridx = 0;
gc.gridy = 0;
final JLabel label = new JLabel(
"<html>" + "please add some more text here"
);
label.setBorder(BorderFactory.createLineBorder(Color.RED));
panel.add(label, gc);
}
{
gc.gridx = 0;
gc.gridy = 1;
final JLabel label = new JLabel(
"<html>" + "please add some more text here"
);
label.setBorder(BorderFactory.createLineBorder(Color.RED));
panel.add(label, gc);
}
final JFrame frame = new JFrame();
frame.add(new ScrollPane(panel));
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(256, 256);
frame.setVisible(true);
}
private class ScrollPane extends JScrollPane implements ComponentListener {
ScrollPane(Container view){
super(view);
this.viewport.addComponentListener(this);
}
@Override
public void componentHidden(ComponentEvent ce){
}
@Override
public void componentMoved(ComponentEvent ce){
}
/** calculating required height is a 3 step process
* 1. sync width of client and viewport, set height of client to high value
* 2. let GridbagManager calculate required minimum size
* 3. set preferredSize and revalidate
**/
@Override
public void componentResized(ComponentEvent ce){
assert(this.viewport == ce.getSource());
final Container view = (Container) this.viewport.getView();
final int width = this.viewport.getExtentSize().width;
view.setPreferredSize(new Dimension(width, Integer.MAX_VALUE));
final int height = view.getLayout().preferredLayoutSize(view).height;
view.setPreferredSize(new Dimension(width, height));
view.revalidate();
}
@Override
public void componentShown(ComponentEvent ce){
}
}
}
+1 gute Frage – mKorbel
'// fügen Sie etwas Text hier' Uh Nein, danke, das lasse ich für dich. In der Tat, für eine bessere Hilfe, post ein [SSCCE] (http://sscce.org/). –