在 java textComponent 中包含 framed/bordered 个单词的 Html 个文本
Html text with framed/bordered words in java textComponent
下面标签中的 html 代码在浏览器中按预期呈现。
好吧,java API 表示不完全支持“边框”,但是填充
该示例也不起作用。
虽然我希望不大,但我想问一下是否有替代方案
html 绘制边框。
我发现最接近的是一个单元格 table。填充有效,但最薄的边框非常丰富。
请注意,我只想框出单个单词,而不是整行或整段。
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);
}
}
不知道您从哪里得到 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.
我快速更改了 RectanglePainter
以绘制背景和边框:
// 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);
我得到了:
注:
- 我添加了一个额外的 space before/after 您想要突出显示的词以获得额外的填充。
- 此外,不确定我为什么使用 JTextPane 进行测试。您可以使用任何文本组件,因此您也可以使用 JTextField。
下面标签中的 html 代码在浏览器中按预期呈现。
好吧,java API 表示不完全支持“边框”,但是填充
该示例也不起作用。
虽然我希望不大,但我想问一下是否有替代方案
html 绘制边框。
我发现最接近的是一个单元格 table。填充有效,但最薄的边框非常丰富。
请注意,我只想框出单个单词,而不是整行或整段。
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);
}
}
不知道您从哪里得到 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.
我快速更改了 RectanglePainter
以绘制背景和边框:
// 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);
我得到了:
注:
- 我添加了一个额外的 space before/after 您想要突出显示的词以获得额外的填充。
- 此外,不确定我为什么使用 JTextPane 进行测试。您可以使用任何文本组件,因此您也可以使用 JTextField。