मेरे पास एक बड़े पैनल के साथ एक स्विंग ऐप है जो JScrollPane
में लपेटा गया है। उपयोगकर्ता आमतौर पर टैबबिंग द्वारा पैनल के सबकंपोनेंट्स के बीच स्थानांतरित होते हैं, इसलिए जब वे किसी चीज़ को देखने के लिए टैब करते हैं, तो मैं स्क्रॉल फलक को ऑटोस्कोलर करना चाहता हूं ताकि इनपुट फोकस वाला घटक हमेशा दिखाई दे।मैं इनपुट फोकस का पालन करने के लिए JScrollPane स्क्रॉल कैसे बना सकता हूं?
मैंने इनपुट फोकस परिवर्तनों को सुनने के लिए KeyboardFocusManager
का उपयोग करने का प्रयास किया है, और फिर scrollRectToVisible
पर कॉल किया है।
यहाँ एक SSCCE मेरे वर्तमान रणनीति प्रदर्शित है (बस कॉपी/पेस्ट और चलाने!):
import java.awt.KeyboardFocusManager;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
public class FollowFocus {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
final int ROWS = 100;
final JPanel content = new JPanel();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
content.add(new JLabel(
"Thanks for helping out. Use tab to move around."));
for (int i = 0; i < ROWS; i++) {
JTextField field = new JTextField("" + i);
field.setName("field#" + i);
content.add(field);
}
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addPropertyChangeListener("focusOwner",
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (!(evt.getNewValue() instanceof JComponent)) {
return;
}
JComponent focused = (JComponent) evt.getNewValue();
if (content.isAncestorOf(focused)) {
System.out.println("Scrolling to " + focused.getName());
focused.scrollRectToVisible(focused.getBounds());
}
}
});
JFrame window = new JFrame("Follow focus");
window.setContentPane(new JScrollPane(content));
window.setSize(200, 200);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
});
}
}
आप इस उदाहरण चलाते हैं, तो आप इसे बहुत अच्छी तरह से काम नहीं करता है पर ध्यान देंगे। यह फोकस परिवर्तन अधिसूचनाएं प्राप्त करता है, लेकिन scrollRectToVisible
पर कॉल का कोई प्रभाव नहीं दिखता है। मेरे ऐप में (जो यहां दिखाने के लिए बहुत जटिल है), scrollRectToVisible
आधे समय तक काम करता है जब मैं व्यूपोर्ट के बाहर कुछ में टैब करता हूं।
क्या इस समस्या को हल करने के लिए एक स्थापित तरीका है? यदि इससे कोई फर्क पड़ता है, तो स्विंग ऐप नेटबीन्स आरसीपी पर बनाया गया है (और हमारे अधिकांश ग्राहक विंडोज चलाते हैं)।
स्पष्टीकरण के लिए धन्यवाद। –
हां, स्पष्टीकरण के लिए धन्यवाद। आपका प्रस्तावित फिक्स मेरे ऐप में काम नहीं करता है (हालांकि यह ऊपर दिए गए उदाहरण में एक आकर्षण की तरह काम करता है), लेकिन थोड़ी सी प्रयोग के बाद मुझे निम्नलिखित काम मिल गया: '((जेकंपोनेंट) केंद्रित .getParent()) scrollRectToVisible (focused.getBounds()) 'अब, कोई भी साँस लेने या ध्यान केंद्रित अनुयायी टूट जाता है ...;) – gustafc