Java 用<;html>;JScrollPane内的标记-删除水平条功能/逻辑
我的要求是使用Java 用<;html>;JScrollPane内的标记-删除水平条功能/逻辑,java,swing,jlabel,jscrollpane,jtextarea,Java,Swing,Jlabel,Jscrollpane,Jtextarea,我的要求是使用JLabel进行单词包装(就像JTextArea所做的那样) 考虑以下代码: public class WrapTest extends JFrame { public WrapTest() { super("test"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); JLabel label
JLabel
进行单词包装(就像JTextArea
所做的那样)
考虑以下代码:
public class WrapTest extends JFrame {
public WrapTest() {
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
JLabel label = new JLabel("Lorem <b>ipsum</b> dolor sit amet, consectetur adipiscing elit. "
+ "Aliquam non pellentesque enim. Donec nec nisl tortor."
+ " Curabitur rutrum molestie est eget varius. Nullam ut lacinia est."
+ " Phasellus hendrerit sollicitudin justo, vitae malesuada dolor vestibulum at."
+ " Integer pharetra purus sed ipsum pulvinar, et pretium odio volutpat. Donec vitae varius metus."
+ " Cras sagittis vulputate erat, at faucibus lectus faucibus id. Cras varius nunc eu felis tristique dapibus."
+ " Aenean enim eros, dapibus pellentesque nibh ut, efficitur malesuada sapien. Nullam imperdiet nunc velit,"
+ "sed laoreet massa mattis eget. Morbi id justo quis sapien aliquet bibendum sed at leo. In mi felis, consectetur"
+ " sed orci eget, tempus maximus turpis. Curabitur sed felis id nisl vehicula sollicitudin sed eget erat.Ut sagittis at nisi sed facilisis."
+ " Morbi vel felis ac diam molestie consequat. Sed nisl lectus, sollicitudin at neque in, "
+ "placerat aliquet nunc. Maecenas quis enim vitae nunc fermentum congue. Sed posuere quam a ultricies fringilla."
+ " Vivamus aliquam nunc lacus, vitae consectetur tortor consequat ut. Cras viverra mi sit amet magna auctor eleifend."
+ " Morbi in risus nisl. Praesent nunc dolor, lobortis nec ultricies aliquet, sollicitudin eu sapien. Fusce interdum ac leo non suscipit."
+ "Vivamus at viverra elit, ut vestibulum elit. Sed bibendum, lorem et ornare sagittis, erat nulla ultricies odio, quis iaculis lacus nisl "
+ "vel ligula. Sed iaculis elit eu felis consectetur dignissim. ");
add(label, BorderLayout.CENTER);
setLocationByPlatform(true);
setSize(500, 200);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new WrapTest().setVisible(true);
});
}
}
我们得出以下结果:
这同样使文本无法阅读。使用sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HorizontalScrollBar\u NEVER)
将使滚动条消失,文本保持水平方向
在这种情况下,有没有办法删除单杠的全部功能?我希望标签可以垂直滚动,并具有单词包装功能。就像一个JTextArea
一样,其行为如下:
我坚持使用JLabel
的原因是易于呈现HTML标记
我试图通过更改组件的
preferredSize
和/或maximumSize
来解决这个问题,但没有得到想要的结果。我尝试的其他方法是使用
或Xpx,但它们也有其他问题。有道理,当帧变大时,它们不会被调整。您是否尝试过:sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS)代码>
否则,您可以尝试使用支持HTML内容的JEditorPane。然后可以将其放置在JScrollPane中。我相信您可以使用JEditorPane
或JTextArea
来禁用编辑,并将其用作容器,以所需换行方式显示文本
但是如果您坚持使用JLabel
的换行并支持垂直滚动,我相信您需要在用户调整帧大小时计算可滚动视口容器的大小:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
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 BorderLayout() );
String text = "Lorem <b>ipsum</b> dolor sit amet, consectetur adipiscing elit. "
+ "Aliquam non pellentesque enim. Donec nec nisl tortor."
+ " Curabitur rutrum molestie est eget varius. Nullam ut lacinia est."
+ " Phasellus hendrerit sollicitudin justo, vitae malesuada dolor vestibulum at."
+ " Integer pharetra purus sed ipsum pulvinar, et pretium odio volutpat. Donec vitae varius metus."
+ " Cras sagittis vulputate erat, at faucibus lectus faucibus id. Cras varius nunc eu felis tristique dapibus."
+ " Aenean enim eros, dapibus pellentesque nibh ut, efficitur malesuada sapien. Nullam imperdiet nunc velit,"
+ "sed laoreet massa mattis eget. Morbi id justo quis sapien aliquet bibendum sed at leo. In mi felis, consectetur"
+ " sed orci eget, tempus maximus turpis. Curabitur sed felis id nisl vehicula sollicitudin sed eget erat.Ut sagittis at nisi sed facilisis."
+ " Morbi vel felis ac diam molestie consequat. Sed nisl lectus, sollicitudin at neque in, "
+ "placerat aliquet nunc. Maecenas quis enim vitae nunc fermentum congue. Sed posuere quam a ultricies fringilla."
+ " Vivamus aliquam nunc lacus, vitae consectetur tortor consequat ut. Cras viverra mi sit amet magna auctor eleifend."
+ " Morbi in risus nisl. Praesent nunc dolor, lobortis nec ultricies aliquet, sollicitudin eu sapien. Fusce interdum ac leo non suscipit."
+ "Vivamus at viverra elit, ut vestibulum elit. Sed bibendum, lorem et ornare sagittis, erat nulla ultricies odio, quis iaculis lacus nisl "
+ "vel ligula. Sed iaculis elit eu felis consectetur dignissim. ";
JLabel label = new JLabel("<html>" +text+ "</html>");
panel.add( label, BorderLayout.CENTER );
final JFrame frame = new JFrame();
frame.add( new WrappingScrollPane( panel ) );
frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
frame.setSize( 256, 256 );
frame.setVisible( true );
}
}
class WrappingScrollPane extends JScrollPane implements ComponentListener {
WrappingScrollPane( 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 LayoutManager calculate required minimum size
* 3. set preferredSize and revalidate
**/
@Override
public void componentResized( ComponentEvent ce ){
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 ){
}
}
导入java.awt.BorderLayout;
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.event.ComponentEvent;
导入java.awt.event.ComponentListener;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.SwingUtilities;
公共类WrappedLabel实现Runnable{
公共静态void main(字符串[]args){
invokeLater(新的WrappedLabel());
}
@凌驾
公开募捐{
最终JPanel面板=新JPanel(新的BorderLayout());
String text=“Lorem ipsum door sit amet,concertetur adipsicing elit。”
+“不可否认的侵权行为。”
+“金樱子是一种葡萄品种,它是一种新品种。”
+“朱斯托·亨德雷特·索利西图因·朱斯托的前庭生活”
+“整只掌跖和掌跖,并在掌跖和掌跖之前,为您提供最新的生命。”
+“秃鹫之箭,在秃鹫之箭上。秃鹫之箭,在秃鹫之箭上。秃鹫之箭。”
+“爱是一种本能,爱是一种本能,爱是一种本能,爱是一种智慧,爱是一种本能。”
+“我是拉奥里特·马萨·马蒂斯·埃吉特。我是莫比·伊德·奎斯·萨皮安·阿利奎特·比本杜姆,在利奥。在米菲利斯,康塞特图”
+“这是一只虎鲸,它是一只大黄羊。它是一只库拉比猫,它是一只小马,在它的设施上生长。”
+“Morbi vel felis ac diam Molectie consequat.Sed nisl lectus,sollicitudin于年在内克”
+“placerat aliquet nunc.Maecenas quis enim vitae nunc congue.Sed posuere quam a ultricies frongilla。”
+“我是一个伟大的拍卖人,我是一个伟大的拍卖人。”
+“莫里斯·尼塞尔的摩比,多洛的祈祷者,其他人的祈祷者,欧盟智者的祈祷者,非宗教信仰者的祈祷者。”
+“viverra elit,ut前庭elit.Sed bibendum,lorem et Orna sagittis,erat nulla ultricies odio,quis iaculis lacus nisl”
+“法利古拉。艾库利斯精英猫科动物荣誉称号。”;
JLabel标签=新的JLabel(“+text+”);
panel.add(标签、BorderLayout.CENTER);
最终JFrame=新JFrame();
框架。添加(新包装窗格玻璃(面板));
frame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE);
帧设置大小(256,256);
frame.setVisible(true);
}
}
类WrappingScrollPane扩展JScrollPane实现ComponentListener{
包装卷窗格(容器视图){
超级(视图);
this.viewport.addComponentListener(this);
}
@凌驾
公共无效组件隐藏(组件事件ce){
}
@凌驾
公共无效组件已移动(组件事件ce){
}
/**计算所需高度需要三个步骤
*1.同步客户端和视口的宽度,将客户端的高度设置为高值
*2.让LayoutManager计算所需的最小尺寸
*3.设置首选大小和重新验证日期
**/
@凌驾
public void componentResistized(ComponentEvent ce){
最终容器视图=(容器)this.viewport.getView();
final int width=this.viewport.getExtentSize().width;
view.setPreferredSize(新维度(宽度,Integer.MAX_值));
final int height=view.getLayout().preferredLayoutSize(视图).height;
view.setPreferredSize(新尺寸(宽度、高度));
view.revalidate();
}
@凌驾
显示的公共无效组件(组件事件ce){
}
}
您需要做的是在添加到滚动窗格的组件上实现可滚动的界面
然后,可以强制该组件适应视口的宽度
最简单的方法是使用,它实现了可滚动
界面的方法,并允许您自定义行为
String wrap = "<html>";
label.setText(wrap + label.getText());
JScrollPane sp = new JScrollPane(label);
add(sp, BorderLayout.CENTER);
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
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 BorderLayout() );
String text = "Lorem <b>ipsum</b> dolor sit amet, consectetur adipiscing elit. "
+ "Aliquam non pellentesque enim. Donec nec nisl tortor."
+ " Curabitur rutrum molestie est eget varius. Nullam ut lacinia est."
+ " Phasellus hendrerit sollicitudin justo, vitae malesuada dolor vestibulum at."
+ " Integer pharetra purus sed ipsum pulvinar, et pretium odio volutpat. Donec vitae varius metus."
+ " Cras sagittis vulputate erat, at faucibus lectus faucibus id. Cras varius nunc eu felis tristique dapibus."
+ " Aenean enim eros, dapibus pellentesque nibh ut, efficitur malesuada sapien. Nullam imperdiet nunc velit,"
+ "sed laoreet massa mattis eget. Morbi id justo quis sapien aliquet bibendum sed at leo. In mi felis, consectetur"
+ " sed orci eget, tempus maximus turpis. Curabitur sed felis id nisl vehicula sollicitudin sed eget erat.Ut sagittis at nisi sed facilisis."
+ " Morbi vel felis ac diam molestie consequat. Sed nisl lectus, sollicitudin at neque in, "
+ "placerat aliquet nunc. Maecenas quis enim vitae nunc fermentum congue. Sed posuere quam a ultricies fringilla."
+ " Vivamus aliquam nunc lacus, vitae consectetur tortor consequat ut. Cras viverra mi sit amet magna auctor eleifend."
+ " Morbi in risus nisl. Praesent nunc dolor, lobortis nec ultricies aliquet, sollicitudin eu sapien. Fusce interdum ac leo non suscipit."
+ "Vivamus at viverra elit, ut vestibulum elit. Sed bibendum, lorem et ornare sagittis, erat nulla ultricies odio, quis iaculis lacus nisl "
+ "vel ligula. Sed iaculis elit eu felis consectetur dignissim. ";
JLabel label = new JLabel("<html>" +text+ "</html>");
panel.add( label, BorderLayout.CENTER );
final JFrame frame = new JFrame();
frame.add( new WrappingScrollPane( panel ) );
frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
frame.setSize( 256, 256 );
frame.setVisible( true );
}
}
class WrappingScrollPane extends JScrollPane implements ComponentListener {
WrappingScrollPane( 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 LayoutManager calculate required minimum size
* 3. set preferredSize and revalidate
**/
@Override
public void componentResized( ComponentEvent ce ){
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 ){
}
}
import java.awt.*;
import javax.swing.*;
public class WrapTest extends JFrame {
public WrapTest() {
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
JLabel label = new JLabel("<html>Lorem <b>ipsum</b> dolor sit amet, consectetur adipiscing elit. "
+ "Aliquam non pellentesque enim. Donec nec nisl tortor."
+ " Curabitur rutrum molestie est eget varius. Nullam ut lacinia est."
+ " Phasellus hendrerit sollicitudin justo, vitae malesuada dolor vestibulum at."
+ " Integer pharetra purus sed ipsum pulvinar, et pretium odio volutpat. Donec vitae varius metus."
+ " Cras sagittis vulputate erat, at faucibus lectus faucibus id. Cras varius nunc eu felis tristique dapibus."
+ " Aenean enim eros, dapibus pellentesque nibh ut, efficitur malesuada sapien. Nullam imperdiet nunc velit,"
+ "sed laoreet massa mattis eget. Morbi id justo quis sapien aliquet bibendum sed at leo. In mi felis, consectetur"
+ " sed orci eget, tempus maximus turpis. Curabitur sed felis id nisl vehicula sollicitudin sed eget erat.Ut sagittis at nisi sed facilisis."
+ " Morbi vel felis ac diam molestie consequat. Sed nisl lectus, sollicitudin at neque in, "
+ "placerat aliquet nunc. Maecenas quis enim vitae nunc fermentum congue. Sed posuere quam a ultricies fringilla."
+ " Vivamus aliquam nunc lacus, vitae consectetur tortor consequat ut. Cras viverra mi sit amet magna auctor eleifend."
+ " Morbi in risus nisl. Praesent nunc dolor, lobortis nec ultricies aliquet, sollicitudin eu sapien. Fusce interdum ac leo non suscipit."
+ "Vivamus at viverra elit, ut vestibulum elit. Sed bibendum, lorem et ornare sagittis, erat nulla ultricies odio, quis iaculis lacus nisl "
+ "vel ligula. Sed iaculis elit eu felis consectetur dignissim. ");
ScrollablePanel panel = new ScrollablePanel( new BorderLayout() );
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
panel.add( label );
JScrollPane sp = new JScrollPane(panel);
add(sp, BorderLayout.CENTER);
setLocationByPlatform(true);
setSize(500, 200);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new WrapTest().setVisible(true);
});
}
}