2012-07-09 17 views
5

मेरे पास एक JScrollPane है जिसका सामग्री फलक एक जेएक्सलिस्ट है। जब मैं सूची में माउस व्हील का उपयोग करता हूं, तो सूची एक समय में तीन (3) आइटम चलाती है। पंक्ति ऊंचाई के बावजूद यह एक टेबल के लिए भी काम करता है। मैं इसे कैसे बदल सकता हूं ताकि - प्लेटफॉर्म पर ध्यान दिए बिना - सूची और तालिका दोनों के लिए स्क्रॉल दूरी बिल्कुल 1 आइटम है? ब्लॉक वृद्धि को सेट करना इसे काट नहीं देता है क्योंकि तालिका में कुछ पंक्तियों की एक अलग ऊंचाई होती है।JSCrollPane स्क्रॉल 1 लाइन प्रति माउस व्हील चरण कैसे बनाएं?

+0

@trashgod थोड़ी देर के लिए नहीं देखा था - पहिया वास्तव में यूनिट में किसी भी तरह का नक्शा लगाने के लिए प्रतीत होता है, और व्यक्तिगत पंक्ति ऊंचाई को संभालता है, इसलिए मेरे संदेह में गलत था। स्क्रॉल करने योग्य कार्यान्वयन को ट्वीव करने में मदद मिल सकती है :-) – kleopatra

+2

कैमिकर [माउस व्हील नियंत्रक] देखें (http://tips4java.wordpress.com/2010/01/10/mouse-wheel-controller/) – aterai

+0

@aterai hach ​​.. भूल गया कि एक :-) निश्चित रूप से जाने का तरीका, कुछ वास्तविक वोटों को पकड़ने के लिए, अपनी टिप्पणी को उत्तर देने पर विचार करें। – kleopatra

उत्तर

7

शुद्ध ब्याज (और एक छोटे से ऊब) से मैं एक काम उदाहरण बनाया:

/** 
* Scrolls exactly one Item a time. Works for JTable and JList. 
* 
* @author Lukas Knuth 
* @version 1.0 
*/ 
public class Main { 

    private JTable table; 
    private JList list; 
    private JFrame frame; 

    private final String[] data; 

    /** 
    * This is where the magic with the "just one item per scroll" happens! 
    */ 
    private final AdjustmentListener singleItemScroll = new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(AdjustmentEvent e) { 
      // The user scrolled the List (using the bar, mouse wheel or something else): 
      if (e.getAdjustmentType() == AdjustmentEvent.TRACK){ 
       // Jump to the next "block" (which is a row". 
       e.getAdjustable().setBlockIncrement(1); 
      } 
     } 
    }; 

    public Main(){ 
     // Place some random data: 
     Random rnd = new Random(); 
     data = new String[120]; 
     for (int i = 0; i < data.length; i++) 
      data[i] = "Set "+i+" for: "+rnd.nextInt(); 
     for (int i = 0; i < data.length; i+=10) 
      data[i] = "<html>"+data[i]+"<br>Spacer!</html>"; 
     // Create the GUI: 
     setupGui(); 
     // Show: 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void setupGui(){ 
     frame = new JFrame("Single Scroll in Swing"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
     frame.add(split); 

     // Add Data to the table: 
     table = new JTable(new AbstractTableModel() { 
      @Override 
      public int getRowCount() { 
       return data.length; 
      } 

      @Override 
      public int getColumnCount() { 
       return 1; 
      } 

      @Override 
      public Object getValueAt(int rowIndex, int columnIndex) { 
       return data[rowIndex]; 
      } 
     }); 
     for (int i = 0; i < data.length; i+=10) 
      table.setRowHeight(i, 30); 
     JScrollPane scroll = new JScrollPane(table); 
     // Add out custom AdjustmentListener to jump only one row per scroll: 
     scroll.getVerticalScrollBar().addAdjustmentListener(singleItemScroll); 
     split.add(scroll); 

     list = new JList<String>(data); 
     scroll = new JScrollPane(list); 
     // Add out custom AdjustmentListener to jump only one row per scroll: 
     scroll.getVerticalScrollBar().addAdjustmentListener(singleItemScroll); 
     split.add(scroll); 
    } 

    public static void main(String[] agrs){ 
     new Main(); 
    } 
} 

असली जादू कस्टम AdjustmentListener, जहाँ हम जाने के लिए और बढ़ाने में किया जाता है वर्तमान "स्क्रॉल-स्थिति" द्वारा प्रति बार एक एकल ब्लॉक। यह उदाहरण में दिखाए गए अनुसार, विभिन्न पंक्ति-आकारों के साथ ऊपर और नीचे काम करता है।


रूप @kleopatra टिप्पणी में उल्लेख किया है, आप भी करने के लिए एक MouseWheelListener का उपयोग केवल माउस पहिया के व्यवहार को फिर से परिभाषित कर सकते हैं।

आधिकारिक ट्यूटोरियल here देखें।

+0

यह बहुत ही भयानक है। बहुत - बहुत धन्यवाद! मेरा मतलब है, यकीन है, कहीं भी .setScrollIncrement (int i) हो सकता है, लेकिन इस तरह यह भी काम करता है। बस एक छोटा सा तरफ: यह कोड स्क्रॉल बार की पृष्ठ सुविधा (हैंडल के बाहर बार पर क्लिक करके) स्क्रॉल बेबी चरणों को बनाता है, जो आपके कोड को अवरुद्ध करने पर बहुत अजीब नहीं है क्योंकि ब्लॉक वृद्धि 1 "वैश्विक स्तर पर" है। क्या माउस व्हील चरण आकार को बदलने का कोई तरीका है? इसके अलावा, क्या आप स्विंग पर एक पुस्तक की सिफारिश कर सकते हैं? – xmjx

+0

आह, थोड़ा और टिप्पणी करना होगा। मैं उत्सुक था कि प्रत्येक बार एडजस्टमेंट लिस्टनर कहलाए जाने पर सेटब्लॉक इंक्रुमेंट (1) को क्यों कॉल किया जाना चाहिए, इसलिए मैंने श्रोता फलक बनाने के समय श्रोता को निष्क्रिय कर दिया और सेटब्लॉक इंक्रुमेंट (1) कहा। निहारना! यह भी एक ही अवांछित दुष्प्रभाव के साथ काम करता है। मुझे याद नहीं है कि इसका प्रभाव मेरे कार्यालय मशीन पर क्या था, इसलिए मैं कल काम पर इसका परीक्षण करूंगा। कभी-कभी मुझे स्विंग पसंद नहीं है। ;-) – xmjx

+0

स्विंग के लिए @xmjx, बस सूर्य/ओरेकल द्वारा प्रदान किए गए ट्यूटोरियल पढ़ें। मैंने इसके लिए एक समर्पित पुस्तक नहीं पढ़ी। स्विंग बहुत शक्तिशाली है, लेकिन यह सबसे छोटा जीयूआई ढांचा भी नहीं है। –

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