- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
似乎 JTextPane 和 JTextArea 呈现的字体不同。它几乎不引人注意,但我仍然想知道它为什么在那里。
我设置了一个SSCCE,但是你真的看不到它。最好的方法是使用 JTextArea 运行程序,然后将代码更改为 JTextPane 并再次运行。它们应该以某种方式重叠,当您从一个窗口切换到另一个窗口(使用 alt+ 选项卡)时,可以看到差异。您必须提供自己的 *.ttf 文件。
这是为什么呢?有没有办法强制 JTextPane 以与 JTextArea 相同的方式呈现文本?
中南合作:
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.IOException;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
public class Main
{
public static void main(String[] args)
{
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels())
{
if ("Nimbus".equals(info.getName()))
{
try
{
UIManager.setLookAndFeel(info.getClassName());
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e)
{
System.out.println("No Nimbus!");
}
break;
}
}
JFrame a = new JFrame("Test");
a.setSize(600, 900);
a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
a.getContentPane().setLayout(new BoxLayout(a.getContentPane(), BoxLayout.Y_AXIS));
Font d = null;
try
{
d = Font.createFont(Font.TRUETYPE_FONT, Main.class.getResourceAsStream("calibri_bold.ttf"));
d = d.deriveFont(23f);
}
catch (FontFormatException | IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
final JTextPane b = new JTextPane();
b.setBorder(new JTextArea().getBorder());
b.setFont(d);
b.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent arg0) {
b.repaint();
}
@Override
public void focusLost(FocusEvent arg0) {
b.repaint();
}
});
b.setText("It seems that JTextPane and JTextArea are rendering fonts differently. It is barely noticeable, but I still want to know why is it there. I have set up a SSCCE, but you can't really see it. Best method would be to run a program with JTextArea, then change the code to JTextPane and run it again. They should overlap in a way when you change from one window to the other (with alt+ tab) the difference can be seen. Why is that? Is there a way to force the JTextPane to render the text the same way as JTextArea does?");
a.getContentPane().add(b);
final JTextArea c = new JTextArea();
c.setFont(d);
c.setText("It seems that JTextPane and JTextArea are rendering fonts differently. It is barely noticeable, but I still want to know why is it there. I have set up a SSCCE, but you can't really see it. Best method would be to run a program with JTextArea, then change the code to JTextPane and run it again. They should overlap in a way when you change from one window to the other (with alt+ tab) the difference can be seen. Why is that? Is there a way to force the JTextPane to render the text the same way as JTextArea does?");
c.setLineWrap(true);
c.setWrapStyleWord(true);
a.getContentPane().add(c);
a.setVisible(true);
}
}
最佳答案
Nimbus L&F
有一些可怕的问题,我们可以将这些问题称为 Bugs
JTextArea
和另一个 JComponents
卡住了 UIManager
Keys
/li>您可以 UIManager.getLookAndFeel().uninitialize();
对于大多数 Key,它们是卡住的,但其中一些能够抵抗所有更改、hacks、woodoo、但是 JTextArea
的 Font
不是这种情况
请注意,您需要重写所有键 3 次,而不是像我的代码中演示的那样,请参阅注释 //...Defaults.put("TextPane.font", res);
主类
UIManager
中的初始更改
UIManager.getLookAndFeel().uninitialize()
之后;被称为
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.FontUIResource;
public class Main {
private JFrame frame = new JFrame("Test");
private JTextPane textPane = new JTextPane();
private JTextArea textArea = new JTextArea();
private String str = "It seems that JTextPane and JTextArea are rendering fonts differently. "
+ "It is barely noticeable, but I still want to know why is it there. "
+ "I have set up a SSCCE, but you can't really see it. Best method would "
+ "be to run a program with JTextArea, then change the code to JTextPane "
+ "and run it again. They should overlap in a way when you change from one "
+ "window to the other (with alt+ tab) the difference can be seen. "
+ "Why is that? Is there a way to force the JTextPane to render the "
+ "text the same way as JTextArea does?";
private javax.swing.Timer timer = null;
final Font fnt = new Font("Brodway", Font.BOLD, 10);
public Main() {
textPane.setBorder(new JTextArea().getBorder());
textPane.setText(str);
textArea.setText(str);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(0, 1));
frame.add(new JScrollPane(textPane));
frame.add(new JScrollPane(textArea));
frame.setVisible(true);
frame.setSize(400, 400);
start();
}
private void start() {
timer = new javax.swing.Timer(2250, updateCol());
timer.setRepeats(false);
timer.start();
}
public Action updateCol() {
return new AbstractAction("text load action") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
try {
LookAndFeel lnf = UIManager.getLookAndFeel().getClass().newInstance();
final FontUIResource res = new FontUIResource(fnt);
UIDefaults uiDefaults = lnf.getDefaults();
//uiDefaults.put("TextPane.font", res);
uiDefaults.put("TextArea.font", res);
UIManager.getLookAndFeel().uninitialize();
UIManager.setLookAndFeel(lnf);
} catch (InstantiationException ex) {
Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedLookAndFeelException ex) {
Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex);
}
UIDefaults defaults = UIManager.getDefaults();
final FontUIResource res = new FontUIResource(fnt);
//defaults.put("TextPane.font", res);
defaults.put("TextArea.font", res);
SwingUtilities.updateComponentTreeUI(frame);
}
};
}
public static void main(String[] args) {
final FontUIResource res = new FontUIResource(new Font("Algerian", Font.BOLD, 10));
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
try {
UIManager.setLookAndFeel(info.getClassName());
UIDefaults defaults = UIManager.getDefaults();
defaults.put("TextPane.font", res);
defaults.put("TextArea.font", res);
} catch (ClassNotFoundException | InstantiationException |
IllegalAccessException | UnsupportedLookAndFeelException e) {
System.out.println("No Nimbus!");
}
break;
}
}
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Main();
}
});
}
}
关于java - JTextArea 和 JTextPane 字体渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19458099/
我正在序列化一个 JTextPane 的 Document,以便将其样式化的文本保存到数据库中。我有一个 caretListener 附加到 JTextPane 我想知道序列化这个 Document
我目前正在尝试制作 Log4j 2登录 JTextPane .它应该像 Netbeans IDE 控制台中的 STDERR 或 STDOUT(包括文本样式 - 颜色)。 我知道我需要创建一个 appe
我在 JScrollPane 中有一个 JTextPane(水平策略从不,垂直策略始终)。我编写了一种在此 JTextPane 中附加文本的方法。现在有一个按钮,单击该按钮时,操作监听器正在运行,执行
我有一个 JTextPane (1),旁边还有另一个 (2)。我已经同步它们,如果在(2)中输入一行,则在(1)中输入一行,但是当我插入图像(24px)时,(2)会自动调整行长度,但(1)当然不会调整
当我使用 JTextPane 并在 HTML 编辑器模式下键入一些文本时 JTextPane textPane = new JTextPane(); textPane.setContentType("
我在 java swing 中有一个应用程序包含 JTextPane 和 HTMLDocument。假设我将 Pane 的文本设置为:
有没有办法读取 JTextPane 的内容逐行?很像 BufferedReader? 最佳答案 Element root = textPane.getDocument().getDefaultRoot
这是我的问题。我正在编写一个具有语法突出显示的编辑器。没什么特别的,但它可以完成工作。问题是我正在实现错误识别,当我想添加样式来下划线时,我覆盖了我以前的样式。这是一个屏幕截图: 我正在做这样的事情来
所以我想写一个简单的编辑器。我想将所有字符之间的所有字符都涂成灰色“字符。它的片段是: class MainPanel extends JPanel { private int WIDTH = 800
我正在开发一个应用程序,当我从列表中选择一个值(文件)时,它应该在不同形式的 jTextPane 中打开。我正在使用两个面板,一个是显示我的列表的主面板,一个是 ExcelSheet,当我单击列表值时
我创建了一个使用 JTextPane 的 Swing 界面。 JTextPane 使用自定义颜色突出显示: textPane.getHighlighter().addHighlight(startPo
有没有办法使 JTextPane 中的文本看起来与控制台输出的文本相似?我的意思是,基本上,每个字符如何具有相同的宽度,以便 ASCII 艺术或间距缩进等内容可以正常工作。 例如,目前,如果我输入“F
我没有得到垂直滚动条。滚动JTextPane。我正在使用 JPanel 显示 JScrollPane 内部的 JTextPane。这是代码。请查看。谢谢。 import java.awt.*; imp
尝试使用此代码,但它不能准确地改变颜色,请注意“停止”一词。当您键入单词时就会发生这种情况。 https://stackoverflow.com/a/28773736/7694892 最佳答案 在我看
我正在尝试用 JScrollPane 包装 JTextPane,并且我需要背景透明。 这是我的代码: public CharPanel(){ super.setLayout(null);
我使用两个语句添加了图像和文本。但在 JTextPane 中,它仅显示文本。我的代码如下 - jTextPane1.insertIcon(new ImageIcon("t.png")); jTextP
我有两个具有静态大小的 JTextPanes,我想像文本处理器中的两个页面一样连接它们。如果我在第一个 JTextPane(页面)中写入一些内容,并且对于一个 JTextPane 来说太长,那么它会溢
我有一个 JTextPane,其模型是 DefaultStyledDocument。我注意到,如果显示文本,然后使用 setCharacterAttributes 将一行上的每个字符更改为更大的字体,
我有来自 Netbeans 设计器部分的 JTextPane。我想在其上添加列和行。但是,JTextPane 的属性窗口中没有添加列或行的选项。还有其他方法可以做到这一点吗? 最佳答案 JTextPa
我有一个文本需要格式化,文本的第一个单词需要加粗、大字体并居中。 为了进行这种格式化,我使用了 TextSamplerDemo.java 中的解决方案在 JTextComponents 的 oracl
我是一名优秀的程序员,十分优秀!