JLabel zawierający tekst HTML automatycznie owija linie przy użyciu dostępnego miejsca. Jeśli dodać JLabel do JSrollPane, musi ustawić preferowaną wartość na przyzwoitą wartość, w przeciwnym razie nie zostanie ona opakowana. Wszystko to powinno działać dobrze razem z innymi komponentami wewnątrz JPanel za pomocą LayoutManager.JLabel z owiniętym tekstem HTML jako klient JScrollPane
Przyczyna Chcę, aby okno aplikacji z możliwością zmiany rozmiaru Rozszerzyłem JScrollPane, aby śledzić zmiany rozmiaru zdarzeń i dynamicznie zmieniać rozmiar zsynchronizowany z szerokością rzutni. Zasadniczo działa, ale czasami obliczenie preferowanej wysokości przez menedżera układu jest nieprawidłowe (wartość za duża lub za mała). Na przykład widoczność czerwonej granicy przecinającej pierwszą linię wskazuje, że obliczenie wysokości jest błędne.
Nie mogę odtworzyć błąd z jednym owijania JLabel.
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 dobre pytanie – mKorbel
'// dodać here' tekstu Uh , nie, dziękuję, zostawię to dla * ciebie * do zrobienia. W rzeczywistości, aby uzyskać lepszą pomoc wcześniej, opublikuj [SSCCE] (http://sscce.org/). –