我对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,,直到我找到它,然后测试了一些方法。我想我遗漏了一些细节。我的环境JDK1.7,JRE7.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)
更新2 setText方法在添加异常处理程序块后工作。但我错过了什么?
发布于 2012-07-13 16:52:57
这不是一个答案,而是一个代码帖子,它显示了您的方法,或者它的一个变体,它允许编码器更改要发布的文本,这是有效的:
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();
}
});
}
}
因此,问题很可能是如何调用您的方法,这是您尚未向我们展示的。
发布于 2012-07-13 17:27:54
根据对你原来问题的评论,
“.它在另一个线程中工作,但是原始线程在创建所有对象之后才开始。”
修改Swing组件的所有代码都必须在事件分派线程中运行。如果你等到一切都被创造出来,那是不够的。
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
// modify swing components
}
});
您可能需要阅读以下内容:Java Event-Dispatching Thread explanation
https://stackoverflow.com/questions/11474361
复制相似问题