2009-11-20 12 views
6

मेरे पास एक समस्या है जहां स्विंग (जावा 1.6, विंडोज़ में) माउस को ट्रिगर नहीं लग रहा है और माउस एक्सक्टेड घटनाओं को जिस तरह से मैं चाहता हूं। मेरे पास एक ऐसा एप्लिकेशन है जहां मैं JSCrollPane में लंबवत रूप से कई जेपीनल स्टैक्ड करना चाहता हूं, और जब माउस उनके ऊपर हो तो उन्हें एक अलग रंग से हाइलाइट किया जाना चाहिए। सरल पर्याप्त समस्या, लेकिन जब भी मैं माउस व्हील का उपयोग कर स्क्रॉल करता हूं, तो यह काफी व्यवहार नहीं करता है।स्विंग माउस टॉवर ट्रिगर नहीं करेगा माउस घुमावदार घटनाओं के बाद ठीक से माउस/ठीक से समायोजित?

मैंने अपनी समस्या (नीचे पाया गया कोड) को चित्रित करने के लिए नमूना आवेदन किया है। नीचे दी गई छवियां उस से हैं, न कि "असली" एप्लिकेशन।

जब मैं एक पैनल के किनारे पर माउस कर्सर पकड़ता हूं, तो यह सही ढंग से हाइलाइट किया जाता है। अब, जब मैं स्क्रॉल करने के लिए माउस व्हील का उपयोग करता हूं, तो मुझे उम्मीद है कि कर्सर बॉक्स बी पर हो जाएगा, और उचित माउसइंटर/माउस एक्सक्टेड घटनाएं ट्रिगर हो जाएंगी ताकि ए सफेद हो और बी लाल हो जाए।

alt text http://perp.se/so/1.png

alt text http://perp.se/so/2.png

हालांकि, ऐसा प्रतीत नहीं होता है।

अब, बी एक और माउस ईवेंट ट्रिगर करते समय हाइलाइट हो जाता है, चाहे वह "1 पिक्सेल ले जाएं", "एक बटन क्लिक करें" या "एक और चरण स्क्रॉल करें"। यह जानकर, मैं शायद इसे एक हैकिश तरीके से हल कर सकता हूं, लेकिन अगर कोई उचित समाधान नहीं है तो मैं नहीं चाहूंगा।

तो मूल रूप से मैं क्या सोच रहा हूं कि अगर इसे स्विंग में एक बग के रूप में माना जाता है, या क्या मैं बस गलत काम कर रहा हूं?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 

public class ScrollTest extends JFrame { 

    public static class LetterPanel extends JPanel { 

     private static final Font BIG_FONT = new Font(Font.MONOSPACED, Font.BOLD, 24); 

     public LetterPanel(String text) { 
      setBackground(Color.WHITE); 
      setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

      addMouseListener(new MouseAdapter() { 

       @Override 
       public void mouseEntered(MouseEvent e) { 
        setBackground(Color.RED); 
       } 

       @Override 
       public void mouseExited(MouseEvent e) { 
        setBackground(Color.WHITE); 
       } 
      }); 

      setLayout(new GridLayout(1, 1)); 
      setPreferredSize(new Dimension(-1, 50)); 

      JLabel label = new JLabel(text, SwingConstants.CENTER); 
      label.setFont(BIG_FONT); 
      add(label); 
     } 
    } 

    public ScrollTest() { 
     setLayout(new GridLayout(1, 1)); 
     setSize(400, 400); 

     JPanel base = new JPanel(); 

     JScrollPane jsp = new JScrollPane(base); 
     jsp.getVerticalScrollBar().setUnitIncrement(16); 
     add(jsp); 

     base.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.gridheight = 1; 
     gbc.gridwidth = 1; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.insets = new Insets(0, 0, 10, 0); 
     gbc.weightx = 1.0; 

     for (char c = 'A'; c <= 'Z'; c++) { 
      base.add(new LetterPanel(String.valueOf(c)), gbc); 
      gbc.gridy++; 
     } 
    } 

    public static void main(String[] args) { 
     final JFrame f = new ScrollTest(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       f.setVisible(true); 
      } 
     }); 
    } 
}
+1

प्रतिबंध किसी कारण से हैं। इसके बिना, एसओएएम पदों में बहुत कुछ था। मैंने छवियों को जोड़ा और यहां नियमों को "मंद" कैसे किया गया है, इस बारे में आपकी टिप्पणियां हटा दीं। –

+0

उन टिप्पणियों के अलावा, आपने एक उत्कृष्ट प्रश्न पूछा है: स्पष्ट छवियां, कोड का एक अच्छा स्निपेट: अच्छी तरह से किया गया। मैं कोई स्विंग गुरु नहीं हूं, लेकिन बाद में इसे देख लूंगा (अगर पहले से इसका उत्तर नहीं दिया गया है)। +1 –

+0

संपादन के लिए धन्यवाद।समस्या से पहले लड़ने के लिए थोड़ा निराशाजनक था, सवाल लिखें, स्निपेट लिखें, अच्छे स्क्रीनशॉट लें, उन्हें सर्वर पर अपलोड करें और फिर मेरे पोस्ट पर एसओ बारफ करें क्योंकि मैं एक नया उपयोगकर्ता हूं। मैं अब बेहतर महसूस कर रहा हूं। :-) – perp

उत्तर

5

यह Tooltips and Scrollpanes में वर्णित एक के लिए एक समान समस्या जैसा प्रतीत होता है। यही है, कोई माउस ईवेंट उत्पन्न नहीं होता है क्योंकि माउस स्वयं नहीं चलता है, व्यूपोर्ट चलता है। मुझे यकीन नहीं है कि माउस स्थान पर घटक को ट्रैक करने के लिए एडजस्टमेंट लिस्टर का उपयोग करके सटीक समाधान अन्य। हर बार परिवर्तन होता है आप पिछले पैनल में माउस एक्स्डिटेड इवेंट और एक माउस एंटरटेड ईवेंट को नए पैनल में आग लगा सकते हैं।

3

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

जब मैं करता हूं कि माउस दर्ज संदेश पिछले पैनल (उसी व्यवहार को आप देख रहे हैं) पर प्राप्त होता है।

इसे देखकर मैं माउस को स्क्रॉल करता हूं और वास्तव में बाहर निकलने/दर्ज घटनाओं को प्राप्त नहीं करता है जब तक कि मैं माउस व्हील "कैच" रखने के लिए पर्याप्त स्क्रॉल नहीं करता। यह संभव है कि जब तक "पकड़" नहीं होता तब तक विंडोज जावा को संदेश नहीं भेजता ... मेरे परीक्षण से यह ऐसा लगता है।

आप माउसहेल लिस्टनर इंटरफ़ेस और माउसइन्फो क्लास में देखना चाहेंगे। मुझे लगता है कि आप व्हील आंदोलन का पता लगाने में सक्षम हो सकते हैं और फिर पता लगा सकते हैं कि आप MouseInfo.getPointerInfo()। GetLocation() के साथ कहां हैं और फिर पता लगाएं कि आप किस घटक पर हैं और हाइलाइटिंग बदलते हैं।

+0

उत्सुक ... आपका "पकड़" पर्याप्त मोटा हो सकता है कि यह माउस को थोड़ा सा स्थानांतरित करता है, जिसके कारण माउस ईवेंट आ जाता है। आप माउस के नीचे हवा में इंगित कर सकते हैं ताकि प्रकाश में कोई कर्षण न हो। यह भी हो सकता है कि आपका स्क्रोल व्हील एक बटन-3 नीचे या कुछ कारण बनता है - ऐसा कुछ जो अन्यथा ध्यान नहीं दिया जाएगा। –

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