2012-01-12 12 views
5

ट्रिगर करने के बाद कर्सर आइकन बदलता नहीं है आकार बदलने योग्य हेडर कॉलम के साथ मेरे एप्लिकेशन में JTable है। आम तौर पर जब मैं कर्सर को आकार बदलने के लिए टेबल हेडर पर ले जाता हूं, तो कर्सर आइकन < -> जैसे आकार बदलने के लिए बदल जाता है।सेट कर्सर विधि

लेकिन निम्नलिखित परिदृश्य में चीजें अलग-अलग हैं।

उसी Frame में एक बटन कार्रवाई है, और कार्रवाई के दौरान, मैं कर्सर को व्यस्त आइकन पर सेट कर रहा हूं और Container.setCurosr(Cursor cursor) विधि का उपयोग कर कार्रवाई पूर्ण होने के बाद इसे डिफ़ॉल्ट कर्सर में बदल सकता हूं।

कभी-कभी अगर मैं कर्सर को आकार बदलने के तालिका शीर्षलेख पर ले जाता हूं, बटन क्रिया के बाद, कर्सर आइकन आकार बदलने के लिए बदलता नहीं है, कर्सर बिल्कुल नहीं बदलता है।

क्या इसे जावा स्विंग में एक बग के रूप में माना जा सकता है या क्या इस समस्या का समाधान है?

अद्यतन: नमूना कोड बटन पर संलग्न

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class ColumnResizeIconTest extends JFrame { 

JScrollPane scrollPane; 
JTable table; 
JButton button; 

public ColumnResizeIconTest() { 
    setLayout(new BorderLayout()); 
    addComponents(); 
    setSize(300,300); 
} 

private void addComponents() { 
    addButton(); 
    addTable(); 
} 

private void addButton() { 
    button = new JButton("Click Me"); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      setWaitCursor(); 
      for(int i=0; i<2000; i++) { 
       System.out.print(i); 
      } 
      setDefaultCursor(); 
     } 
    }); 
    add(button, BorderLayout.NORTH); 
} 

private void addTable() { 
    scrollPane = new JScrollPane(createTable()); 
    add(scrollPane, BorderLayout.CENTER); 
} 

private JTable createTable() { 
    Object[][] cellData = { { "1-1", "1-2","1-3" }, { "2-1", "2-2", "2-3" }, { "3-1", "3-2", "3-3" } }; 
    String[] columnNames = { "column1", "column2", "column3" }; 
    table = new JTable(cellData, columnNames); 
    return table; 
} 

private void setWaitCursor() { 
    Container container = getContentPane(); 
    setWaitCursor(container); 
} 

private void setWaitCursor(Container container) { 
    for(int iCount = 0; iCount < container.getComponentCount(); iCount++) { 
     Component child = (Component) container.getComponent(iCount); 
     if(child instanceof Container) { 
      setWaitCursor((Container) child); 
     } else { 
      child.setCursor(new Cursor(Cursor.WAIT_CURSOR)); 
     } 
    } 
    container.setCursor(new Cursor(Cursor.WAIT_CURSOR)); 
} 

private void setDefaultCursor() { 
    Container container = getContentPane(); 
    setDefaultCursor(container); 
} 

private void setDefaultCursor(Container container) { 
    for(int iCount = 0; iCount < container.getComponentCount(); iCount++) { 
     Component child = (Component) container.getComponent(iCount); 
     if(child instanceof Container) { 
      setDefaultCursor((Container) child); 
     } else { 
      child.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
     } 
    } 
    container.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
} 

public static void main(String[] argv) throws Exception { 
    ColumnResizeIconTest test = new ColumnResizeIconTest(); 
    test.setVisible(true); 
} 
} 

क्लिक करें कई बार और तालिका स्तंभ का आकार बदलने की कोशिश करो। कर्सर डिफ़ॉल्ट कर्सर के साथ फंस गया है।

+0

जावा किस संस्करण में जावा का संस्करण है? –

+2

1) जल्द से जल्द बेहतर सहायता के लिए, एक [एसएससीसीई] (http://sscce.org/) पोस्ट करें। 2) * "इसे एक बग के रूप में माना जा सकता है .." * शायद। * ".. जावा स्विंग में .." * शायद नहीं। * ".. या इस मुद्दे के लिए कोई समाधान है?" * अपना कोड ठीक करें (शायद)। –

+1

@ एंड्रयू थॉम्पसन आज के लिए शायद कितना संभव है, 4 से शायद 4 से सहमत हो गए हैं। – mKorbel

उत्तर

8

जैसा कि पहले से ही मेरी टिप्पणी में उल्लेख किया गया है: यह पूरी तरह से पुनः नहीं है और कर्सर, एक घटक के लिए भी नहीं :-) मूल समस्या (रिकर्सिव कर्सर सेटिंग में प्रतीक्षा करने के लिए) यह धारणा है कि सभी घटक में डिफ़ॉल्ट कर्सर है।

जैसा कि आप तालिका शीर्षलेख पर देखते हैं, वह धारणा सही नहीं है: उस घटक पर, "डिफ़ॉल्ट" या तो डिफ़ॉल्ट स्थान कर्सर या आकार बदलें कर्सर, माउस स्थान के आधार पर होता है। इसके अतिरिक्त, आंतरिक कर्सर टॉगलिंग बहुत बुद्धिमान नहीं है: यह राज्य की जांच नहीं करता है (मेरे सिर के शीर्ष से, उस तथ्य से थोड़ी देर पहले मारा गया था :-)

पूरी तरह से सुनिश्चित नहीं है कि आप क्या पहुंचना चाहते हैं, तो पूरी तरह से रिकर्सिव सेटिंग को छोड़कर, एक ठोस समाधान नहीं है, सही होने के लिए बहुत मुश्किल है। विकल्प

  • हो सकता है glassPane पर waitCursor (फ्रेम के rootpane का) बनाने के दृश्य और सेट यह
  • उपयोग JLayer (jdk7) या JXLayer (jdk6) एक छोटे क्षेत्र पर और सेट waitCursor कि
  • पर
  • एक कम घुसपैठ दृश्यता का उपयोग करें, फाईJProgressBar या एक JXBusyLabel (in the SwingX project) कहीं

परिशिष्ट (@mKorbel के लिए :-)

समस्या

(उसके लिए धन्यवाद ऑप्स SSCCE एक छोटे से बदलाव के साथ आसानी से प्रतिलिपि प्रस्तुत करने योग्य है,): परिवर्तन नीचे दिए गए ऐडबटन विधि, फिर बटन पर क्लिक करें और प्रतीक्षा कर्सर दिखाए जाने पर, माउस को हेडर में ले जाएं और फिर किसी अन्य कॉलम (कॉलम सीमा पर) पर जाएं। ऐसा कई बार करने से हेडर पर अप्रत्याशित कर्सर हो जाएंगे ...

private void addButton() { 
    button = new JButton("Click Me"); 
    final ActionListener off = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      setDefaultCursor(); 
      button.setEnabled(true); 
     } 

    }; 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      setWaitCursor(); 
      button.setEnabled(false); 
      Timer timer = new Timer(2000, off); 
      timer.setRepeats(false); 
      timer.start(); 
     } 
    }); 

    add(button, BorderLayout.NORTH); 
} 
+0

तक नहीं देखें ..., मुझे यकीन था कि एफआरआई 13 वां है, अगर मैं सही ढंग से याद करता हूं तो यह ईडीटी समस्या को हल करता है, मैंने सिमिलियर प्रश्न पढ़ा है (जहां पता नहीं है) इसके बारे में, कि इस प्रक्रिया को दो अलग-अलग कार्रवाइयों में विभाजित किया जाना चाहिए, अन्यथा मूल ओएस से आने वाले ऑब्जेक्ट्स के लिए ईवेंट के ऑर्डर की गारंटी नहीं है, शायद फोकस – mKorbel

+0

के साथ ही मैं +1 – mKorbel

+0

@mKorbel EDT उल्लंघनों के लिए भूल गया हूं प्राकृतिक अपराधी - इस बार नहीं, हालांकि, यह केवल अपूर्ण तर्क है :-) – kleopatra

1

1) आप पृष्ठभूमि कार्य करने के लिए कोड

for(int i=0; i<2000; i++) { 
    System.out.print(i); 
} 

अनुप्रेषित है, तो आप javax.swing.Timer, SwingWorke आर लागू करता है सकते हैं, या Runnable#Thread अंदर इन कोड रेखाओं को रैप, उदाहरण के here

2) आप पुनर्स्थापित करना है CursorError/Exception पर भी, शायद यही कारण है कि कर्सर नहीं बदला गया

+0

मुझे डर है कि आप मेरी समस्या को सही ढंग से समझ गए हैं। बटन क्लिक करने से पहले, यदि मैं टेबल कर्सर हेडर के बीच के अंतर पर अपना कर्सर डालता हूं, तो कर्सर <-> का अर्थ है कि मैं आकार बदल सकता हूं। जब मैं बटन पर क्लिक करता हूं, कार्रवाई के अंदर, यह कर्सर को घंटे का गिलास में बदल देगा और कार्रवाई शुरू करेगा। जब कार्रवाई समाप्त हो जाती है तो कर्सर को डिफ़ॉल्ट कर्सर में बदल दिया जाता है और कार्रवाई को छोड़ दिया जाता है। उसके बाद यदि मैं कर्सर को टेबल हेडर कॉलम अंतर पर रखता हूं, तो आइकन डिफ़ॉल्ट आइकन है, <-> नहीं। ऐसा होता है अगर मैं बटन को कुछ बार क्लिक करता हूं। लेकिन मैं अभी भी कॉलम का आकार बदलने में सक्षम हूं। – AnupD

+0

आपकी समस्या उत्पन्न करने में सक्षम नहीं है, न ही यदि मैं कई बार जेबटन को धक्का देता हूं, तो मैंने कर्सर को जेएफआरएएम, जेबटन, जेटीबल पर रीडायरेक्ट किया और मैं इस मुद्दे को कर्सर के साथ जीनरेट कर सकता हूं, जब और केवल अगर कुछ अपवाद उत्पन्न होता है और कर्सर नहीं बदला जाता है अंत में ब्लॉक में, फिर कर्सर। WET_CURSOR, हम्म हमेशा के लिए रहें – mKorbel

+0

हम्म .. मुझे अपवाद भाग मिला, लेकिन यह मामला यहां नहीं है। मेरी इच्छा है कि मैं आपके साथ इस मुद्दे का एक वीडियो या स्क्रीनशॉट साझा कर सकूं। – AnupD

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