سؤال

هذا يقودني إلى الجنون تمامًا.

أعلم أنه لتغيير تنسيق خلايا الجدول باستخدام JTable ، يجب أن أستخدم العارض الخاص بي. لكن لا يمكنني تطبيق هذا بشكل صحيح.

هذا هو الإعداد الحالي الخاص بي:

public class MyClass
{
    public static void main(String args[])
    {
        JTable myTable = new JTable(10, 10);
        myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer());
    }
}

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Formatting
        return c;
    }
}

ماذا أحتاج إلى استخدام المعلمة الأولى من setDefaultRenderer؟ API فقط يقول "الطبقة". ليس لدي أي فكرة عما يجب وضعه هناك.

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

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

المحلول

في المعلمة الأولى ل setDefaultRenderer, ، ضع ال الفصل الحرفي بالنسبة للفصل الذي تريد تجاوزه. أي إذا كانت بياناتك تتكون من جميع الأوتار ، فيمكنك وضعها

myTable.setDefaultRenderer(String.class, new CustomRenderer());

إذا كانت بياناتك تتكون أيضًا من قيم مع BigDecimal أو Integer كطبقات ، عليك استدعاء هذه الطريقة عدة مرات لكل نوع فئة (BigDecimal.class أو Integer.class في كل حالة).

وأخيراً ، لتغيير لون الخلفية ، تقوم بذلك في العارض الخاص بك:

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(new java.awt.Color(255, 72, 72));
        return c;
    }
}

إذا كتبت عارضًا يجب أن يعمل من أجله جميع فئات الواجهة, ، ستحتاج أيضًا إلى تعديل getColumnClass وظيفة الخاص بك نموذج الجدول ودعها تُرجع فئة الواجهة لجميع الكائنات التي تنفذ هذه الواجهة:

public Class<? extends Object> getColumnClass(int c) {
    Object object = getValueAt(0, c);
    if(object == null) {
        return Object.class;
    if(getValueAt(0, c) instanceof IColorable) {
        return ICarPart.class;
    } else {
        return getValueAt(0, c).getClass();
    }
}

مع ذلك ، يمكن للمرء أن يسجل عارضًا لـ icolate.class ولا يحتاج إلى تسجيل عارض منفصل لكل تطبيق.

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