- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Java Swing 中创建一个文本编辑器应用程序。我正在使用 JTextPane,并且添加了代码来获取 JComboBox 中的所有系统字体和一些字体大小。
我在 jtextpane 中输入了文本“Hello World”,并将“Hello”的字体更改为“Arial”,字体大小更改为 10,将“World”更改为“Calibri”,字体大小更改为 12。
我的预期场景:如果我选择单词“Hello”或将光标放在单词“Hello”上,则字体 JCombobox 中的字体名称应自动更改为“Arial”,字体大小 Jcombobox 应自动更改为 10,与单词“World”,Jcombobox 中的值应更改为“Calibri”和“12”。我怎样才能实现这个目标?提前致谢。
最佳答案
这基本上解决了如何选择与所选文本或文本中的光标位置相对应的组合框项目的问题。对于这个例子,我只选择了字体大小。同样的技术也可以应用于字体系列。
该示例是使用 JTextPane
的文本编辑器,其文档类型是 DefaultStyledDocument
。有一个 JComboBox
,其中包含字体大小列表(16 到 50)。人们可以在编辑器中选择一段文本,然后从组合框中选择字体大小,以将文本设置为该字体大小。这是通过使用添加到 JComboBox
的 ItemListener
来实现的。监听器具有将编辑器文档的属性设置为新选择的字体大小 - 所选文本的代码。
编辑器允许将多种字体大小应用于文本的不同部分,如下图所示。
要求是当插入符号(或光标)放置在文本或选定文本的一部分中时 - 需要在 JComboBox
中使用该字体设置相应的字体大小尺寸。为此,将 CaretListener
添加到 JTextPane
中。
该监听器的逻辑主要是定位插入符位置,获取该位置文档文本的属性并提取字体大小属性。该属性的字体大小在字体大小组合框中设置。
示例代码:
public class Editor2 {
private JTextPane editor;
private DefaultStyledDocument doc;
private JComboBox<String> fontSizeComboBox;
private boolean caretControlFlag;
private static final int DEFAULT_FONT_SIZE = 18;
public static void main(String [] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Editor2().createAndShowGUI();
}
});
}
private void createAndShowGUI() {
editor = new JTextPane();
editor.setMargin(new Insets(5, 5, 5, 5));
editor.addCaretListener(new MyCaretListener());
JScrollPane editorScrollPane = new JScrollPane(editor);
doc = new DefaultStyledDocument();
initDocAttrs();
editor.setDocument(doc);
final String [] fontSizes = {"Font Size", "16", "18",
"20", "24", "28", "30", "34", "40", "50"};
fontSizeComboBox = new JComboBox<String>(fontSizes);
fontSizeComboBox.setEditable(false);
fontSizeComboBox.addItemListener(new FontSizeItemListener());
JFrame frame = new JFrame("Text Editor");
frame.add(fontSizeComboBox, BorderLayout.NORTH);
frame.add(editorScrollPane, BorderLayout.CENTER);
frame.add(editorScrollPane);
frame.setSize(800, 400);
frame.setLocation(300, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
editor.requestFocusInWindow();
}
private void initDocAttrs() {
Style style = doc.addStyle("my_doc_style", null);
StyleConstants.setFontSize(style, 18);
StyleConstants.setFontFamily(style, "SansSerif");
doc.setParagraphAttributes(0, doc.getLength(), style, true);
}
private class FontSizeItemListener implements ItemListener {
@Override
public void itemStateChanged(ItemEvent e) {
if ((e.getStateChange() != ItemEvent.SELECTED) ||
(fontSizeComboBox.getSelectedIndex() == 0)) {
return;
}
String fontSizeStr = (String) e.getItem();
int newFontSize = 0;
try {
newFontSize = Integer.parseInt(fontSizeStr);
}
catch (NumberFormatException ex) {
return;
}
if (caretControlFlag) {
caretControlFlag = false;
return;
}
setFontAttrs(newFontSize);
editor.requestFocusInWindow();
}
private void setFontAttrs(int newFontSize) {
SimpleAttributeSet attrs = new SimpleAttributeSet();
Style docStyle = doc.getStyle("my_doc_style");
int size = StyleConstants.getFontSize(docStyle);
StyleConstants.setFontSize(attrs, newFontSize);
String attrName = "mysize" + Integer.toString(newFontSize);
attrs.addAttribute(attrName, attrName);
int startPos = editor.getSelectionStart();
String selectedText = editor.getSelectedText();
if (selectedText == null || selectedText.trim().isEmpty()) {
return;
}
int length = selectedText.length();
doc.setCharacterAttributes(startPos, length, attrs, false);
editor.setDocument(doc);
}
}
private class MyCaretListener implements CaretListener {
@Override
public void caretUpdate(CaretEvent e) {
caretControlFlag = true;
int dot = e.getDot();
Element ele = doc.getCharacterElement(dot);
AttributeSet attrs = ele.getAttributes();
String fontSizeStr = "18";
for (Enumeration en = attrs.getAttributeNames(); en.hasMoreElements();) {
String attrName = en.nextElement().toString();
if (attrName.contains("mysize")) {
fontSizeStr = attrName.substring(6);
}
}
fontSizeComboBox.setSelectedItem(fontSizeStr);
caretControlFlag = false;
}
}
}
关于java - 如何在JTextPane中放置光标或选择文本时更改JCombobox中相应的字体名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53152657/
我正在序列化一个 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
我是一名优秀的程序员,十分优秀!