gpt4 book ai didi

java - JTextArea/JTextComponent setText 导致崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:05 24 4
gpt4 key购买 nike

我是 Java 的新手,尤其是 Swing 库。当我尝试使用记事本演示(来自 JDK 的标准演示)时,我在尝试更改编辑器窗口中的文本时遇到了崩溃。我的示例代码:

void Filter(Component f){
if (f instanceof JTextComponent){
JTextComponent textComponent = (JTextComponent) f;
textComponent.setVisible(false); //Works
textComponent.setVisible(true); //Works
textComponent.getText(); //Works
textComponent.updateUI(); //Works
textComponent.setText("Hello world!"); //Crashes
}else{
RecursiveGet(f);
}
}
void RecursiveGet(Component c){
for (Component f : ((JComponent) c).getComponents()) {
if (f instanceof JComponent) {
Filter(f);
}
}
}

我搜索了例如 JTextComponent,直到找到它,然后测试了一些方法。我想我遗漏了一些东西,一些细节。我的环境 JDK 1.7,JRE 7.0,Win7 x64。我很乐意提供任何帮助。谢谢。

更新我添加异常处理程序

void Filter(Component f){
if (f instanceof JTextComponent){
JTextComponent textComponent = (JTextComponent) f;
textComponent.setVisible(false); //Work
textComponent.setVisible(true); //Work
textComponent.getText(); //Work
textComponent.updateUI(); //Work
try {
textComponent.setText("Hello world!"); //Crash
} catch (Exception e) {
e.printStackTrace();
}
}else{
RecursiveGet(f);
}
}

得到这个..

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.synth.SynthContext.getPainter(Unknown Source)
at javax.swing.plaf.synth.SynthTextAreaUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown S
ource)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$700(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

更新 2setText 方法在添加异常处理程序 block 后起作用。但是我想念什么?

最佳答案

这不是答案,而是显示您的方法或其变体(允许编码人员更改要发布的文本的方法)有效的代码帖子:

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.text.*;

@SuppressWarnings("serial")
public class TestFilter extends JPanel {
public TestFilter() {
JPanel textFieldPanel = new JPanel(new GridLayout(0, 3));
for (int i = 0; i < 15; i++) {
textFieldPanel.add(new JTextField(10));
}

JPanel buttonPanel = new JPanel();
buttonPanel.add(new JButton(new FilterAction("Show Text", "Hello World")));
buttonPanel.add(new JButton(new FilterAction("Clear Text", "")));

setLayout(new BorderLayout());
add(textFieldPanel, BorderLayout.NORTH);
add(new JScrollPane(new JTextArea(10, 15)));
add(buttonPanel, BorderLayout.SOUTH);
}

private class FilterAction extends AbstractAction {
private String text;

public FilterAction(String name, String text) {
super(name);
this.text = text;
}

@Override
public void actionPerformed(ActionEvent e) {
filter(TestFilter.this, text);
}
}

void filter(Component f, String text) {
if (f instanceof JTextComponent) {
JTextComponent textComponent = (JTextComponent) f;
textComponent.setVisible(false); // Works
textComponent.setVisible(true); // Works
textComponent.getText(); // Works
textComponent.updateUI(); // Works
textComponent.setText(text); // Crashes
} else {
RecursiveGet(f, text);
}
}

void RecursiveGet(Component c, String text) {
for (Component f : ((JComponent) c).getComponents()) {
if (f instanceof JComponent) {
filter(f, text);
}
}
}

private static void createAndShowGui() {
JFrame frame = new JFrame("TestFilter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new TestFilter());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

因此,问题很可能是您如何调用您的方法,您尚未向我们展示的内容。

关于java - JTextArea/JTextComponent setText 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com