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