Một JLabel chứa văn bản HTML tự động kết thúc tốt đẹp các dòng bằng cách sử dụng không gian có sẵn. Nếu người ta thêm JLabel đó vào một JSrollPane, anh ta phải thiết lập giá trị ưa thích cho một giá trị phong nha nếu không nó sẽ không bọc. Tất cả điều này sẽ làm việc tốt cùng với các thành phần bên trong một JPanel bằng cách sử dụng một LayoutManager.JLabel với gói HTML-văn bản như khách hàng JScrollPane
Vì tôi muốn cửa sổ ứng dụng có thể định lại, tôi mở rộng JScrollPane để theo dõi các sự kiện thay đổi kích thước và tự động thay đổi kích thước được đồng bộ hóa với chiều rộng của chế độ xem. Về cơ bản nó hoạt động nhưng đôi khi việc tính toán chiều cao ưa thích của trình quản lý bố cục là sai (giá trị quá lớn hoặc quá nhỏ). Ví dụ, khả năng hiển thị của đường viền màu đỏ cắt qua hàng đầu tiên cho biết rằng việc tính toán chiều cao là sai.
tôi không thể tái tạo sự thất bại với một gói JLabel duy nhất.
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 tốt câu hỏi – mKorbel
'// thêm một số văn bản here' Uh , không, cảm ơn, tôi sẽ để điều đó cho * bạn * làm. Trong thực tế, để được trợ giúp tốt hơn sớm hơn, hãy đăng một [SSCCE] (http://sscce.org/). –