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);
        });
    }
}