2010-08-24 6 views
27

संक्षिप्त: सेल पंक्ति को हाइलाइट करने के लिए मुझे "राइट-क्लिक ईवेंट" की आवश्यकता है।जावा स्विंग जेटीबल; राइट क्लिक मेनू (मैं इसे "चयन" उर्फ ​​पंक्ति में हाइलाइट करने के लिए कैसे प्राप्त करूं)

मैं जावा स्विंग (नेटबीन्स मैटिस) में स्क्रॉलपैन के अंदर एक जेटीबल का उपयोग कर रहा हूं। मुझे लगता है कि निम्नलिखित करता JTable पर एक MouseClicked घटना श्रोता है:

if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) { 
      System.out.println("Right Click"); 
      JPopUpMenu.show(myJTable, evt.getX(), evt.getY()) 
} 

समस्या है ... जब भी मैं JTable पर राइट क्लिक पर अमल, पंक्ति हाइलाइट नहीं किया गया (मैं पंक्तियों को चयन सेट केवल बीटीडब्ल्यू)। मैंने कई सेट-चयन() फ़ंक्शंस की तलाश की है लेकिन उपयुक्त नहीं मिल सका। डिफ़ॉल्ट रूप से, बायाँ क्लिक स्वचालित रूप से पंक्ति को हाइलाइट करता है। मैं इसे सही क्लिक के लिए कैसे सेट अप करूं?

उत्तर

80

इस तरह:

table.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mouseReleased(MouseEvent e) { 
     int r = table.rowAtPoint(e.getPoint()); 
     if (r >= 0 && r < table.getRowCount()) { 
      table.setRowSelectionInterval(r, r); 
     } else { 
      table.clearSelection(); 
     } 

     int rowindex = table.getSelectedRow(); 
     if (rowindex < 0) 
      return; 
     if (e.isPopupTrigger() && e.getComponent() instanceof JTable) { 
      JPopupMenu popup = createYourPopUp(); 
      popup.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 
}); 

......

+1

बस इसी तरह:] ... माउस के शीर्ष आधे रील किए गए() की मुझे आवश्यकता है। मतदान किया जाएगा + एक जवाब के रूप में स्वीकार किया जाएगा। धन्यवाद, आप आदमी (या महिला) हैं! –

+6

ग्रेट उत्तर। एक विवरण: कुछ प्लेटफ़ॉर्म (मैक ओएस एक्स इसे नाम देने के लिए) पर, पॉपअप मेनू 'माउस रीलेज्ड' की बजाय 'माउस दबाए गए 'द्वारा ट्रिगर किया जाता है, इसलिए यदि आप इस कोड का उपयोग करते हैं तो पॉपअप दिखाई नहीं देगा यदि आप मैक ओएस पर अपना एप्लिकेशन चलाते हैं एक्स – gabuzo

+0

पंक्ति इंडेक्स को दो बार प्राप्त करने का क्या उद्देश्य है? मेरा मतलब है, * आर * और * rowindex * के बीच क्या अंतर है? –

1

स्वीकार किए जाते हैं जवाब ctrl या खाते में पारी तरह संशोधक कुंजियों नहीं ले करता है, फिर भी वे संकेत मिलता है कि वर्तमान चयन को प्रतिस्थापित किया जाना चाहिए, लेकिन विस्तारित होना चाहिए।

इसके अलावा, मैंने mousePressedऔरmouseReleased की जांच करके बहु-ओएस समर्थन जोड़ा।

निम्नलिखित, चेक सहित ListSelectionModel का उपयोग करके चयनित पंक्तियों को समायोजित करने के तरीके पर आप एक पूर्ण उदाहरण पा सकते हैं। उसके बाद, एक (वैकल्पिक) JPopupMenu खोलना संभव है।

JPopupMenu contextMenu = new JPopupMenu(); 
// ... 
// add elements to the popup menu 
// ... 

table.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mousePressed(MouseEvent e) { 
    handleRowClick(e); 
    if (e.isPopupTrigger()) { 
     doPop(e); 
    } else { 
     hidePop(); 
    } 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    if (e.isPopupTrigger()) { 
     doPop(e); 
    } 
    } 

    private void handleRowClick(MouseEvent e) { 
    ListSelectionModel selectionModel = table.getSelectionModel(); 
    Point contextMenuOpenedAt = e.getPoint(); 
    int clickedRow = table.rowAtPoint(contextMenuOpenedAt); 

    if (clickedRow < 0) { 
     // No row selected 
     selectionModel.clearSelection(); 
    } else { 
     // Some row selected 
     if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK) { 
     int maxSelect = selectionModel.getMaxSelectionIndex(); 

     if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) { 
      // Shift + CTRL 
      selectionModel.addSelectionInterval(maxSelect, clickedRow); 
     } else { 
      // Shift 
      selectionModel.setSelectionInterval(maxSelect, clickedRow); 
     } 
     } else if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) { 
     // CTRL 
     selectionModel.addSelectionInterval(clickedRow, clickedRow); 
     } else { 
     // No modifier key pressed 
     selectionModel.setSelectionInterval(clickedRow, clickedRow); 
     } 
    } 
    } 

    private void doPop(MouseEvent e) { 
    if (table.getSelectedRowCount() == 0) { 
     return; 
    } 
    contextMenu.setVisible(true); 
    contextMenu.show(e.getComponent(), e.getX(), e.getY()); 
    } 

    private void hidePop() { 
    contextMenu.setVisible(false); 
    } 
}); 
+0

मैन्युअल चयन हैंडलिंग की कोई आवश्यकता नहीं है, जेटीबल पहले ही SHIFT और CTRL कुंजी का सम्मान करता है और इसी तरह। मूल समाधान में आवश्यक परिवर्तन केवल setRowSelectionInterval() का उपयोग नहीं करना है, यदि फोकस पंक्ति पहले से ही चुनी गई है, जैसे: if (! Table.getSelectionModel()। IseelectedIndex (r)) table.setRowSelectionInterval (r, r); –

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