صنع خلية JTable قابلة للتحرير - ولكن * ليس * بالنقر المزدوج

StackOverflow https://stackoverflow.com/questions/1268201

سؤال

أحاول إضافة عمود إلى JTable مع السلوك التالي (على غرار مستكشف Windows والقذائف المشابهة):

  • يمكن النقر فوق الخلية مرة واحدة لتحديدها، كالعادة.
  • يمكن النقر نقرا مرة واحدة على إجراء إجراء منفصل (بدء برنامج خارجي).
  • لا يزال من الممكن تحرير قيمة الخلية (سلسلة)، عن طريق النقر أحادي المرة المرة الثانية (بعد إيقاف مؤقت) أو عن طريق الضغط F2. عندما يتم تسليط الضوء على الخلية.

النقر المزدوج يجب ليس يؤدي تحرير الخلية، ولكن أود أن أترك أي مشغلات تحرير افتراضية أخرى تعمل إذا أمكن ذلك.

لقد حاولت إضافة MouseListener إلى الطاولة، واستهلك الجميع MouseEventS، ولكن هذا لا يعمل - إذا عدت true من isCellEditable() ثم لا يتلقى مستمعي أي أحداث نقرة ولكن إذا عدت false ومن بعد F2. لم تعد تعمل.

هل يمكن تحقيق ذلك باستخدام مستمعي الأحداث فقط؟ أفضل عدم الفوضى وظائف Plaf إذا استطعت تجنبها.

هل كانت مفيدة؟

المحلول

سوف تضطر إلى جعل الخلايا الخلية الخاصة بك و ovveride

public boolean isCellEditable( EventObject e )

يمكنك التمييز بين واحد وانقر فوق نقرة مزدوجة مع ClickCount على EventObject

إذا كان بنقرة واحدة، فستكون في خلية محددة، يمكنك إرجاعها صحيحا بإرجاع خطأ؛

استرداد الصف والعمود مع

int row = ( (JTable) e.getSource() ).rowAtPoint(e.getPoint());
int column = ( (JTable) e.getSource() ).columnAtPoint(e.getPoint());

لتمكين F2 يمكنك إضافة إدخالات Inputmap مخصصة En ActionMap

similar too
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown");
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction()); 

ومن الإجراء الخاص بك يمكنك إطلاق النار بعد ذلك

table.editCellAt(row, column );

نصائح أخرى

يحتوي DefaultCellEditor على أسلوب SetClickCountTostArT () للتحكم في نقرات الماوس للتحرير. الافتراضي هو 2. تغيير هذا لن يكون له أي تأثير على وظيفة F2.

لذلك يمكنك تعيين التحرير لتكون انقر ثلاثي.

لست متأكدا من كيفية التعامل بالضبط كيفية التعامل مع نقرات واحدة لبدء التحرير، لكنني أعتقد أنك ستستخدم مؤقتا لتتبع النقر الأول ثم قم بالتحرير إذا كان النقر الثاني الثاني في غضون فترة زمنية.

لقد حلت هذا عن طريق التفاف القائمة CellEditor مع Proxy واعتراض المكالمات isCellEditable, ، عودة كاذبة لجميع أحداث الماوس وتفويض جميع المكالمات الأخرى إلى الأصل CellEditor.

هذا أكثر تعقيدا قليلا من محلول كاميك ولكن يعمل لجميع المحررين (لدي 4 في الكل.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top