سؤال

لدي Jtable مع 3 أعمدة. لقد قمت بتعيين TableCellRenderer لجميع الأعمدة الثلاثة مثل هذا (ربما ليست فعالة جدا؟).

 for (int i = 0; i < 3; i++) {
     myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
 }

ال getTableCellRendererComponent() إرجاع مكون بلون خلفية عشوائي لكل صف.
كيف يمكنني تغيير الخلفية إلى لون عشوائي آخر أثناء تشغيل البرنامج؟

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

المحلول

طريقة واحدة هي تخزين اللون الحالي لكل صف داخل النموذج. إليك نموذجًا بسيطًا ثابتًا في 3 أعمدة و 3 صفوف:

static class MyTableModel extends DefaultTableModel {

    List<Color> rowColours = Arrays.asList(
        Color.RED,
        Color.GREEN,
        Color.CYAN
    );

    public void setRowColour(int row, Color c) {
        rowColours.set(row, c);
        fireTableRowsUpdated(row, row);
    }

    public Color getRowColour(int row) {
        return rowColours.get(row);
    }

    @Override
    public int getRowCount() {
        return 3;
    }

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public Object getValueAt(int row, int column) {
        return String.format("%d %d", row, column);
    }
}

لاحظ أن setRowColour المكالمات fireTableRowsUpdated; ؛ سيؤدي هذا إلى تحديث هذا الصف من الجدول.

يمكن للعارض الحصول على النموذج من الجدول:

static class MyTableCellRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        MyTableModel model = (MyTableModel) table.getModel();
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(model.getRowColour(row));
        return c;
    }
}

سيكون تغيير لون الصف بسيطًا مثل:

model.setRowColour(1, Color.YELLOW);

نصائح أخرى

استئناف إجابة ريتشارد فيرن ، لجعل كل سطر ثانٍ رمادي:

jTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
        return c;
    }
});

تعمل الإجابات الأخرى المقدمة هنا بشكل جيد لأنك تستخدم نفس العارض في كل عمود.

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

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

في هذا المثال ، يغير النقر فوق الزر لون الخلفية للصف ثم يستدعي إعادة الطلاء.

public class TableTest {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final Color[] rowColors = new Color[] {
                randomColor(), randomColor(), randomColor()
        };
        final JTable table = new JTable(3, 3);
        table.setDefaultRenderer(Object.class, new TableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus,
                    int row, int column) {
                JPanel pane = new JPanel();
                pane.setBackground(rowColors[row]);
                return pane;
            }
        });
        frame.setLayout(new BorderLayout());

        JButton btn = new JButton("Change row2's color");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                rowColors[1] = randomColor();
                table.repaint();
            }
        });

        frame.add(table, BorderLayout.NORTH);
        frame.add(btn, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    private static Color randomColor() {
        Random rnd = new Random();
        return new Color(rnd.nextInt(256),
                rnd.nextInt(256), rnd.nextInt(256));
    }
}

الدعوة إلى getTableCellRendererComponent(...) يتضمن قيمة الخلية التي يتم طلب العارض من أجلها.

يمكنك استخدام هذه القيمة لحساب اللون. إذا كنت تستخدم أيضًا AbstractTableModel ، فيمكنك توفير قيمة من النوع التعسفي للعارض الخاص بك.

بمجرد حصولك على لون ، يمكنك setBackground() على المكون الذي تعود إليه.

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