Un JLabel contenente testo HTML avvolge automaticamente le linee utilizzando lo spazio disponibile. Se si aggiunge JLabel a un JSrollPane, deve impostare il valore preferito su un valore decente altrimenti non si concluderà. Tutto questo dovrebbe funzionare bene insieme ad altri componenti all'interno di un JPanel usando un LayoutManager.JLabel con testo HTML avvolto come client JScrollPane
Causa Desidero una finestra di applicazione ridimensionabile Ho esteso JScrollPane per tenere traccia degli eventi di ridimensionamento e modificare dinamicamente la dimensione sincronizzata alla larghezza della finestra. Fondamentalmente funziona, ma a volte il calcolo dell'altezza preferita dal gestore di layout è sbagliato (valore troppo grande o troppo piccolo). Ad esempio, la visibilità del bordo rosso che taglia la prima riga indica che il calcolo dell'altezza è errato.
non riesco a riprodurre l'errore con un unico JLabel avvolgimento.
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 buona domanda – mKorbel
'// aggiungere un po 'di testo here' Uh , no grazie, lascerò che * tu * faccia. In effetti, per un aiuto migliore, pubblicare un [SSCCE] (http://sscce.org/). –