سؤال

أنا حاليا إعادة صياغة JTable والتي تعرض العديد من أنواع البيانات المختلفة. السبب الرئيسي لهذا إعادة الإنفاق هو أنه هناك عدد قليل ClassCastExceptions (المؤلف / الصديق الذي كتب التعليمات البرمجية غير متوقفة في حالة توقف)، ولا أستطيع أن أجد مكان نشأته. بسبب الكود الكبير، أنا في خسارة فيما يتعلق بمكان البدء. هل يوجد لدى احد أي اقتراحات؟ أدرك واعتذر عن غموض هذا السؤال!

لقد تضمنت تتبع المكدس أدناه. شكرًا!!

استثناء في مؤشر الترابط "AWT-EventQueue-0" java.lang.classcastException: java.lang.string لا يمكن أن يلقي إلى java.lang.boolean في javax.swing.jtable $ booleanrenderer.gettableCellRendererComponent (مصدر غير معروف) في javax.swing.jtable .prepareerenderer (مصدر غير معروف) في javax.swing.plaf.basic.basictableui.paintcell (مصدر غير معروف) في javax.swing.plaf.basic.basic.basic.basictableui.paintcells (مصدر غير معروف) في javax.swing.plaf.basic.basictableui.paint (مصدر غير معروف) في javax.swing.plaf.componentui.update (مصدر غير معروف) في javax.swing.jcomponent.paintcomponent (مصدر غير معروف) في javax.swing.jcomponent.paint (مصدر غير معروف) في javax.swing.jcomponent.painttooffscren (مصدر غير معروف) في javax.swing.bufferstrategynager.Paint (مصدر غير معروف) في javax.swing.repaintmonager.paint (مصدر غير معروف) في javax.swing.jcomponent._paintimmediely (مصدر غير معروف) في javax.swing.jomponent.paintimmediely (غير معروف المصدر) في javax.swing.repaintmanager.paintirtyregion (مصدر غير معروف) في javax.swing.repaintmanager. PaintDirtyRegionRegionRegion (مصدر غير معروف) في javax.swing.repaintmanager.seqpaintdirtseRegion (مصدر غير معروف) في javax.swing.systemeventqueue الفقار $ componentworkrequest.run (مصدر غير معروف) في java.awt.event.invocationevent.dispatch (مصدر غير معروف) في java.awt. EventQueue.dispatchEvent (مصدر غير معروف) في java.awt.eventdispatchthread.pumponeeventforters (مصدر غير معروف) في java.awt.eventdispatchthread.pumpeventsforterter (مصدر غير معروف) في java.awt.eventdispatchyrad.pumpeventsforhierarchy (مصدر غير معروف) في java.awt.eventdispatchthread. ضخ (مصدر غير معروف) في java.awt.eventdispatchthread.pumpevents (مصدر غير معروف) في java.awt.eventdispatchthread.run (مصدر غير معروف)
هل كانت مفيدة؟

المحلول

هذا الخطأ الذي يحدث في BooleanRenderer هو لأنه يتوقع أن القيمة الموجودة من طراز الجدول هي من النوع Boolean وحاول الإدلاء بها (إجابة AKF لديها الخط الدقيق من التعليمات البرمجية حيث يحدث ذلك).

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

نصائح أخرى

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

أعتقد أن المشكلة تأتي من سطح الطالب الخاص بك (JTable.getModel ()) قالت في مكان ما

(..)
public Class<?> getColumnClass(int column)
   {
   switch(column)
     {
   (...)
      case XX: return Boolean.class;
      }
   }

ولكن القيمة في النموذج الخاص بك في هذا العمود هي سلسلة

public Object getValueAt(int row,int column)
  {
  (..)
   switch(column)
     {
   (...)
      case XX: return (a String);
      }
  }

لتصحيح هذه المشكلة، قد ترغب في التفكير في عض الرصاصة ووضع نقطة توقف في JTable$BooleanRenderer.getTableCellRendererComponent() على الخط الذي يجعل المصبوب

setSelected((value != null && ((Boolean)value).booleanValue()));

(من عند JTable.java 1.288 06/11/15)

والتحقق من نوع الفصل من value. وبعد عندما تجد String, ، يمكنك تحديد العمود المخالف والصف من النموذج الخاص بك. سوف تعطيك ذلك على الأقل بداية حول تحديد المشكلة.

آسف لحفر سؤال قديم، لكنني هربت هذه المسألة بنفسي وخرج هذا المنصب في بحث وهذا ما هرب.

كان لدي اختبارات صارخة تفشل (وأرمي في الواقع استثناءات وقت التشغيل) ولكنني واصلت تشغيل إضافة / يزيل على JTable الخاص بي (في اختبار Junit) الذي وضع تطبيق واجهة المستخدم الرسومية في حالة سيئة، وسوف أرى كلاسكاستكساس يأتي بالضبط كريس قد وصف.

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

كان لدي نفس المشكلة، وكان السبب تماما كما يحدد Avrom. في حالتي، كان لي getValueAt نفذت على النحو التالي:

@Override
synchronized public Object getValueAt(int row, int col) {
  if (row < m_rows.size()) {
    return m_rows.get(row).getValueAt(col);
  } 
  else 
  {
    return "";  // THIS IS THE BUG
  }
}

المشكلة هنا هي أنه، هو صف غير موجود، يتم إرجاع سلسلة، لكل عمود. ومع ذلك، فإن بعض أعمدةي لديها نوع فئة، منطقي، وبالتالي الاستثناء:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
  at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(JTable.java:5409)
  at javax.swing.JTable.prepareRenderer(JTable.java:5736)

كان الحل ببساطة لتغيير قيمة الإرجاع إلى:

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