تغيير لون خلية JTable
-
03-07-2019 - |
سؤال
هذا يقودني إلى الجنون تمامًا.
أعلم أنه لتغيير تنسيق خلايا الجدول باستخدام 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 ولا يحتاج إلى تسجيل عارض منفصل لكل تطبيق.