Строка цвета Java jTable при изменении определенной ячейки - PullRequest
0 голосов
/ 19 апреля 2019

Привет всем Я не нахожу, что неправильно в моем коде ниже. Он заполняет таблицу и заголовки просто отлично. Однако, когда я изменяю строку 1, столбец 1 на test и щелкаю, это не окрашивает строку, как я ожидал. Затем щелчок по тому, на котором я щелкнул, становится зеленым, и с тех пор, когда я нажимаю на стол, он становится зеленым.

Столбец не изменится с 1 (Компания) , так как это будет столбец по умолчанию, в который будут внесены изменения. строка является единственным динамическим числом здесь.

Поток для проверки:

  • дважды щелкните IBM.
  • введите тест .
  • нажмите на любую другую ячейку, чтобы сохранить значение этой ячейки.
  • строка не изменяется (строка 1).
  • снова нажмите на тестовую ячейку.
  • все строки изменятся на зеленый.

Ожидаемый поток:

  • дважды щелкните IBM.
  • введите тест .
  • нажмите на любую другую ячейку, чтобы сохранить значение этой ячейки.
  • ячейка, которая была изменена на test , изменяет эту строку green .
  • щелкните Акции для ячейки (3, 3) .
  • дважды щелкните и измените 4000 на 1000 .
  • нажмите на любую другую ячейку, чтобы сохранить значение этой ячейки.
  • ячейка, которая была изменена на 1000 , изменяет эту строку красный .

Заполнены таблицы и заголовки:

enter image description here

Нажатие и изменение значения строки 1, столбца 1 на test :

enter image description here

Нажав эту ячейку на другую после редактирования:

enter image description here

А теперь нажмите на любую другую ячейку (обратите внимание, что строка теста не зеленая, как должно быть):

enter image description here

Теперь нажмите на ячейку, которую я редактировал для test :

enter image description here

И вы видите выше, это просто раскраска каждой строки, на которую я нажимаю, независимо от логики, которую я сказал

if ("test" .equals (тип)) {... .

Java-код:

@SuppressWarnings("serial")
public class TableRowRenderingTip extends JPanel {
    public TableRowRenderingTip() {
        Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
        Object[][] data =
        {
            {"Buy", "IBM", new Integer(1000), new Double(80.5), Boolean.TRUE},
            {"Sell", "Dell", new Integer(2000), new Double(6.25), Boolean.FALSE},
            {"Short Sell", "Apple", new Integer(3000), new Double(7.35), Boolean.TRUE},
            {"Buy", "MicroSoft", new Integer(4000), new Double(27.50), Boolean.FALSE},
            {"Short Sell", "Cisco", new Integer(5000), new Double(20), Boolean.TRUE}
        };

        DefaultTableModel model = new DefaultTableModel(data, columnNames) {
            @SuppressWarnings({ "unchecked", "rawtypes" })
            public Class getColumnClass(int column) {
                return getValueAt(1, column).getClass();
            }
        };

        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Border", createBorder(model));
        add(tabbedPane);
    }

    private JComponent createBorder(DefaultTableModel model) {
        JTable table = new JTable(model) {
            private Border outside      = new MatteBorder(1, 0, 1, 0, Color.RED);
            private Border _outside     = new MatteBorder(1, 0, 1, 0, Color.GREEN);
            private Border inside       = new EmptyBorder(0, 1, 0, 1);
            private Border highlight    = new CompoundBorder(outside, inside);
            private Border _highlight   = new CompoundBorder(_outside, inside);

            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                JComponent jc = (JComponent)c;
                String type = (String)getModel().getValueAt(convertRowIndexToModel(row), 1);

                if (isRowSelected(row)) {           
                    if ("test".equals(type)) {
                        jc.setBorder( _highlight ); // Green color
                        jc.setBackground(Color.GREEN);
                    } else {
                        jc.setBorder( highlight ); //Red color
                    }
                }

                return c;
            }
        };

        //table.setPreferredScrollableViewportSize(table.getPreferredSize());
        //table.changeSelection(0, 0, false, false);        
        return new JScrollPane( table );
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI()
    {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("Table Row Rendering");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableRowRenderingTip() );
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Так что, само собой разумеется, я немного расстроен, чтобы сказать, чтобы, поскольку я уже несколько часов работал над этим, пытаясь выяснить, в чем может быть проблема.

Я уверен, что это будет что-то простое, что я просматриваю ...

1 Ответ

1 голос
/ 19 апреля 2019

Вы забыли установить границу и подсветить ее по умолчанию, если условие теста не соответствует действительности.Например

if (isRowSelected(row)) {
    if ("test".equals(type)) {
        jc.setBorder(_highlight); // Green color
        jc.setBackground(Color.GREEN);
    } else {
        jc.setBorder(highlight); // Red color
    }
} else {
    jc.setBorder(null);
    jc.setBackground(null);
}
...