【问题标题】:Html text with framed/bordered words in java textComponentjava textComponent中带有框/边框字的HTML文本
【发布时间】:2021-11-24 11:11:27
【问题描述】:

下面标签中的 html 代码按预期在浏览器中呈现。
好吧,java API 声明“边框”不完全受支持,但是中的填充 该示例也不起作用。
虽然我希望不大,但我想问一下是否有替代方案 html 来绘制边框。
我发现最接近的是一个单元格表。那里的填充工作,但最薄的边框非常丰富。
请注意,我只想框住单个单词,而不是整行或整段。

import javax.swing.*;

public class HtmlLabel extends JFrame {

  public HtmlLabel() {
    setSize(300,200);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setTitle("A JLabel with HTML text");

    JLabel lb= new JLabel("""
    <html>Please give <span style="border:1px solid; background:#D8EAFC;\
    padding:5px">me</span> a frame.</html>""");
    add(lb);
    setVisible(true);
  }

  public static void main(String args[]) {
    SwingUtilities.invokeLater(HtmlLabel::new);
  }

}

【问题讨论】:

  • Swing 仅支持 HTML 3.5 和有限的 CSS,这可能是这些限制之一
  • 我只想框出单个单词,而不是整行或段落。 - 那么您的示例应该表明这一点。您当前的示例可以使用 JLabel 和边框中的普通文本轻松实现。当您在句子中仅“框定”单个单词时,我无法准确说出您期望看到的内容。我对HTML一无所知,但也许可以使用其他方法来达到您想要的效果。
  • @camickr 是的,您对示例的评论是正确的。所以我更新了代码。 - 目标是使文本看起来像一个小按钮,从而吸引眼球。 Html 可以绘制按钮,但是 java 只支持那些可操作的按钮,这意味着你可以真正按下它们。但是,对于帮助文本,我更喜欢死按钮。除了 html 表格解决方案之外,我还可以显示一个图形文件,然后我必须为每个按钮创建该文件 - 不是很吸引人,因为相当耗时。
  • 试试基于 HTML 的 kbd 元素..
  • @Andrew Thompson 感谢您的建议,但在 Firefox 和 Java 中,标签仅将文本的字体呈现给 Monospace。

标签: java html swing border


【解决方案1】:

不知道您的 HTML 从哪里获得或如何构建它。

也许您可以将JTextPane 与自定义Painter 一起使用:

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.border.*;

public class TextPaneInsert2
{
    private static void createAndShowGUI()
    {
        JTextPane textPane = new JTextPane();
        textPane.setText("Please  give  me a frame");
        textPane.setEditable( false );

        try
        {
            RectanglePainter rp = new RectanglePainter( Color.BLACK );
            textPane.getHighlighter().addHighlight(7, 13, rp);
        }
        catch (Exception e) {System.out.println(e);}

        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(textPane, BorderLayout.PAGE_START);
        frame.add(textPane, BorderLayout.PAGE_END);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}

以上代码使用Rectangle Painter

我对@9​​87654327@ 做了一个快速更改以绘制背景和边框:

//  Code is the same as the default highlighter except we use drawRect(...)
g.setColor(Color.CYAN);
g.fillRect(r.x, r.y, r.width, r.height);
//g.drawRect(r.x, r.y, r.width - 1, r.height - 1);
g.setColor(Color.BLACK);
g.drawRect(r.x, r.y, r.width - 1, r.height);

我得到了:

注意:

  1. 我在您要突出显示的单词之前/之后添加了一个额外的空格以获得额外的填充。
  2. 另外,不知道为什么我使用 JTextPane 进行测试。您可以使用任何文本组件,因此也可以使用 JTextField。

【讨论】:

  • 首先感谢您抽出宝贵的时间来解决这个问题。结果看起来非常好。 - 我有一些窗口只包含一个带有帮助文本和 [OK] 按钮的 JLabel。我在 Html 中发现的令人愉快的是,它可以在现场完成所有格式设置(标题、列表、表格、垂直填充),因此不需要 java 代码,因此文本变得易于修改和维护。但是由于 JTextPanes “理解” Html,我会考虑从 JLabels 切换到 JTextPanes。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
相关资源
最近更新 更多