मुझे एक ही समस्या थी, और मैं इसके बारे में खोज रहा था। अब तक मुझे ऐसा करने के दो तरीके मिले।
- "अगर मैं इसे अपने आप को फिर से लिखने की गई थी" विधि: जावा से आधार वर्ग में संशोधन करना।
TableColumn
एक नया संपत्ति, की आवश्यकता होगी "resizingAllowed" की तरह, यह "reorderingAllowed" की आवश्यकता होगी। इस से, संशोधनों BasicTableHeaderUI
में जगह ले:
वहां पहले से ही है:
private static boolean canResize(TableColumn column,
JTableHeader header) {
return (column != null) && header.getResizingAllowed()
&& column.getResizable();
}
यह बहुत की आवश्यकता होगी:
private static boolean canMove(TableColumn column,
JTableHeader header) {
return (column != null) && header.getReorderingAllowed()
&& column.getReorderable();
}
(ध्यान दें कि यदि आप पहले कॉलम नहीं करना चाहते केवल स्थानांतरित करने के लिए, आप टेबल कॉलम को बदलने के बिना कर सकते हैं:
private static boolean canMove(TableColumn column,
JTableHeader header) {
return (column != null) && header.getReorderingAllowed()
&& header.getColumnModel().getColumnIndex(column.getIdentifier()) != 0;
}
mousePressed
में
- ,
header.getReorderingAllowed()
के बजाय canMove()
बुला: )
के बाद, दो स्थानों पर MouseInputListener
में संशोधित करने के लिए। यह सुनिश्चित करता है कि एक स्तंभ जो स्थानांतरित नहीं किया जाना चाहिए, नहीं होगा।
लेकिन यह पर्याप्त नहीं है, हमें किसी अन्य को खींचने के दौरान स्थिर कॉलम को स्थानांतरित करने से रोकने की आवश्यकता है। तुम्हें पता है, mouseDragged
भी बदलने की जरूरत है जब यह "newColumnIndex" हो रही है:
अगर (0 < newColumnIndex & & newColumnIndex < cm.getColumnCount())
आप शर्त जोड़ने की जरूरत यदि यह नई अनुक्रमणिका स्थानांतरित की जा सकती है, उदाहरण के लिए "canMove()" विधि का उपयोग कर। इस तरह, जब आप इस अबाध को कॉलम खींचेंगे, तो भी आप इसे खींचेंगे, लेकिन यह उन्हें स्वैप नहीं करेगा।
ध्यान दें कि इस विधि के लिए आपको अपने JTable के लिए उपयोग किए जाने वाले JTableHeader के लिए यूआई को स्पष्ट रूप से सेट करने की आवश्यकता होगी, जो वास्तव में आदर्श नहीं है। लेकिन यह सबसे अनुकूल है हालांकि, यह उस स्थान पर समस्या से संबंधित है जहां इसे माना जाता है।
- विधि "क्या हम वास्तव में है के साथ सामान्य व्यवहार को ब्लॉक करने की कोशिश करते हैं": यूआई, JTableHeader पर इस विधि फोकस यूआई द्वारा किए गए आदेशों को ब्लॉक करने को संशोधित नहीं।
पहले, पहले कॉलम खींच ब्लॉक करने के लिए, हम इस ओवरराइड विधि के साथ JTableHeader से एक उपवर्ग की जरूरत है,:
@Override
public void setDraggedColumn(TableColumn pAColumn)
{
int lIndex = -1;
if (pAColumn != null)
lIndex = getColumnModel().getColumnIndex(pAColumn.getIdentifier());
if (lIndex != 0)
super.setDraggedColumn(pAColumn);
}
यह पहला स्तंभ खींच से रोकेगा। लेकिन पहले वर्णित की तरह, यह समस्या का केवल एक हिस्सा है, हमें इस पहले के साथ स्वैपिंग से दूसरे ड्रैग किए गए कॉलम को रोकने की आवश्यकता है।
अभी तक, मेरे पास इसके लिए कोई सही विधि नहीं है। मैं TableColumnModel उपवर्गीकरण, और moveColumn()
विधि अधिभावी द्वारा की कोशिश की:
@Override
public void moveColumn(int pColumnIndex, int pNewIndex)
{
//Move only if the first column is not concerned
if (pColumnIndex =! 0 && pNewIndex != 0)
super.moveColumn(pColumnIndex, pNewIndex);
}
लेकिन यह काम नहीं करेगा, के रूप में यूआई mouseDragged
विधि में वैसे भी माउस स्थिति अपडेट करेगा, आप अपने घसीटा स्तंभ से एक कूद करना होगा एक और जगह पर।
तो मैं अभी भी खोज रहा हूं, और आश्चर्य है कि किसी के पास इस हिस्से से संबंधित प्रस्ताव हैं या नहीं।
मुझे आपके प्रश्न के माध्यम से 70% मिल गया और 2 टेबल का उपयोग करने के लिए आपको एक प्रतिक्रिया लिखना शुरू कर दिया ... फिर मैंने आपकी पोस्ट पढ़ना समाप्त कर दिया। – jjnguy
तो आप कह रहे हैं कि पहला कॉलम दूसरों से स्वतंत्र होना चाहिए? –
वह पूरे कॉलम, बाएं और दाएं स्थानांतरित करने के बारे में बात कर रहा है। – jjnguy