Добавление кнопок внутри ячейки JTable вместе с данными? - PullRequest
9 голосов
/ 15 января 2010

Можно ли добавить кнопки внутри ячейки JTable вместе с данными? Я пытаюсь создать таблицу со столбцами, отображающими данные (число) из базы данных, и двумя кнопками для увеличения / уменьшения числа внутри одной ячейки.

| ID | Количество |
| 06 | 2 [+] [-] |

это было бы что-то вроде выше с [+] [-] кнопками. Поэтому, когда я нажимаю [+], число изменится на 3 и 1, если нажать [-].

Ответы [ 3 ]

15 голосов
/ 15 января 2010

Да, это возможно, хотя это будет нелегко.

Вы должны написать свой собственный рендерер ячеек и собственный редактор ячеек .

Это образец, который я сделал за 5 минут:

sample

Это далеко от совершенства, но показывает концепцию.

Вот исходный код:

import java.awt.Component;
import java.awt.Font;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.Dimension;

public class CustomCell {
    public static void main( String [] args ) { 
        Object [] columnNames = new Object[]{ "Id", "Quantity" };
        Object [][] data        = new Object[][]{ {"06", 1}, {"08", 2} };

        JTable table = new JTable( data, columnNames ) { 
            public TableCellRenderer getCellRenderer( int row, int column ) {
                return new PlusMinusCellRenderer();
            }
         };

        table.setRowHeight( 32 );
        showFrame( table );
    }

    private static void showFrame( JTable table ) {
        JFrame f = new JFrame("Custom Cell Renderer sample" );
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.add( new JScrollPane( table ) );
        f.pack();
        f.setVisible( true );
    }
}

class PlusMinusCellRenderer extends JPanel implements TableCellRenderer {
        public Component getTableCellRendererComponent(
                            final JTable table, Object value,
                            boolean isSelected, boolean hasFocus,
                            int row, int column) {
                this.add( new JTextField( value.toString()  ) );
                this.add( new JButton("+"));
                this.add( new JButton("-"));
                return this;
        }
}

Вот тема, которая может быть интересной и здесь .

1 голос
/ 15 января 2010

Как уже говорилось в учебнике , вам понадобится и средство рендеринга для отображения вашего значения, и редактор для обнаружения событий из редактируемой ячейки. В этом примере , Component представляет собой JCheckBox. Обратите внимание, что для этого требуется пользовательский DataModel, который расширяет AbstractTableModel для предоставления правильного Class для данного столбца. Предложение Джунаса использовать JSpinner хорошо, что хорошо работает.

1 голос
/ 15 января 2010

Я думаю, что вам нужно создать пользовательское средство визуализации ячеек, если вы хотите показать в ячейке что-либо кроме текста (или чисел). Работа средства визуализации ячеек состоит в том, чтобы рисовать все, что вам нужно показать в ячейке.

См. Таблица рендеринга документации .

Так что в этом случае вы можете создать небольшой JPane, который содержит текстовое поле и крошечные кнопки + и - или просто компонент JSpinner, если он делает то, что вам нужно. Немного сложно, конечно, но должно быть возможно.

...