2012-07-13 19 views
5

का कारण बनता है मैं जावा में सामान्य रूप से और विशेष रूप से स्विंग लाइब्रेरी के साथ नया हूं। जब मैंने नोटपैड डेमो (जेडीके से मानक डेमो) के साथ प्रयोग किया, तो मुझे संपादक विंडो में टेक्स्ट बदलने की कोशिश करते समय एक क्रैश हो गया। मेरे नमूना कोड:JTextArea/JTextComponent setText क्रैश

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 उदाहरण के लिए खोज की है, जब तक मुझे मिल गया और फिर कुछ तरीकों का परीक्षण किया। मुझे लगता है कि मुझे कुछ याद आ रहा है, कुछ विवरण। मेरा पर्यावरण जेडीके 1.7, जेआरई 7.0, विन 7 एक्स 64। मुझे कोई मदद करने में खुशी होगी। धन्यवाद।

अद्यतन मैं अपवाद संचालक

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 विधि काम करने के बाद अपवाद संचालक ब्लॉक जोड़ें। लेकिन मुझे क्या याद आती है?

+0

वहाँ रहे हैं किसी भी त्रुटि की सूचना दी? – Brainbot

+2

'दुर्घटना' से आपका क्या मतलब है? क्या यह अपवाद फेंकता है? यदि हां, तो यह क्या है? –

+0

मेरा मतलब है नोटपैड ऐप जमे हुए हैं और मेरे हेरफेर का जवाब नहीं देंगे। – Darius

उत्तर

4

यह एक जवाब नहीं है, लेकिन एक कोड दिखा पोस्ट अपने विधि, या यह का एक प्रकार, एक है कि सांकेतिक शब्दों में बदलनेवाला क्या पाठ पोस्ट करने के लिए बदलने के लिए अनुमति देता है, काम करता है कि:

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(); 
     } 
     }); 
    } 
} 

इस प्रकार की समस्या है संभावना है कि आप अपनी विधि कैसे कॉल कर रहे हैं, कुछ ऐसा जो आपने हमें अभी तक नहीं दिखाया है।

+0

ठीक है, मैं सभी कोड दिखाने की कोशिश करता हूं लेकिन मुझे दोष नहीं देता) जैसा कि मैंने इसका प्रयोग कहा है। चलने योग्य कोड पोस्ट करने के प्रयास के लिए – Darius

+0

+1, और यह दिखा रहा है कि 'सेटटेक्स्ट' वास्तव में काम करता है :-) @ डेरियस संख्या, सभी कोड न दिखाएं। एक [एसएससीसीई] (http://sscce.org) पोस्ट करें जो आपकी समस्या का प्रदर्शन करता है। – Robin

2
अपने मूल प्रश्न पर टिप्पणी के अनुसार

,

"[...] यह एक और धागा में काम [एस], लेकिन [मूल] थ्रेड प्रारंभ [एस] के बाद सभी वस्तुओं बनाया .. "

स्विंग घटक को संशोधित करने वाला सभी कोड ईवेंट प्रेषण धागे में चलाना चाहिए। यदि आप सब कुछ बनने तक प्रतीक्षा करते हैं तो यह पर्याप्त नहीं है।

java.awt.EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     // modify swing components 
    } 
}); 

आप इस पढ़ने के लिए चाहते हो सकता है: Java Event-Dispatching Thread explanation

... और इस: Java: Swing Libraries & Thread Safety

+0

स्टैक ट्रेस के अनुसार, यह अपवाद * ईवेंट प्रेषण धागे से आ रहा है। –

+1

मूल प्रश्न की टिप्पणियों में, उन्होंने लिखा: "और यह एक और धागे में काम करता है, लेकिन धागे सभी वस्तुओं के निर्माण के बाद शुरू होता है .." – lbalazscs

संबंधित मुद्दे