Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable вывод не только текста, Хочется всунуть в таблицу кнопку удалить 
:(
    Опции темы
НовыйСтиль
  Дата 13.1.2011, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.12.2010
Где: Брест

Репутация: нет
Всего: нет



Хочу что бы в таблице было пару кнопок, что то вроде с дискеткой и крестиком.
для этого я сделал такую штуку:
Код

import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;


public class table {

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        Object[] [] dataTable = 
        { 
                  {"name", new JButton("12")}
        };
        String[] columnNames = {"имя", "кнопка"};
        JFrame frame = new JFrame("Test frame");
        frame.setMinimumSize(new Dimension(600, 480));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultTableModel sprBSModel = new DefaultTableModel(dataTable, columnNames);
        JTable TableSprBS = new JTable(sprBSModel);
        frame.add(TableSprBS);
        frame.show();

    }

}


но получил вот что:
user posted image

далее решил разобраться на примерах чек бокса, нашёл по ссылке пример

Код

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class SimpleTableDemo extends JPanel {
    private boolean DEBUG = false;

    public SimpleTableDemo() {
        super(new GridLayout(1,0));

        String[] columnNames = {"First Name",
                                "Last Name",
                                "Sport",
                                "# of Years",
                                "Vegetarian"};

        Object[][] data = {
        {"Kathy", "Smith",
         "Snowboarding", new Integer(5), new Boolean(false)},
        {"John", "Doe",
         "Rowing", new Integer(3), new Boolean(true)},
        {"Sue", "Black",
         "Knitting", new Integer(2), new Boolean(false)},
        {"Jane", "White",
         "Speed reading", new Integer(20), new Boolean(true)},
        {"Joe", "Brown",
         "Pool", new Integer(10), new Boolean(false)}
        };

        final JTable table = new JTable(data, columnNames);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);

        if (DEBUG) {
            table.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    printDebugData(table);
                }
            });
        }

        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);

        //Add the scroll pane to this panel.
        add(scrollPane);
    }

    private void printDebugData(JTable table) {
        int numRows = table.getRowCount();
        int numCols = table.getColumnCount();
        javax.swing.table.TableModel model = table.getModel();

        System.out.println("Value of data: ");
        for (int i=0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j=0; j < numCols; j++) {
                System.out.print("  " + model.getValueAt(i, j));
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("SimpleTableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        SimpleTableDemo newContentPane = new SimpleTableDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}


но в итоге опять облом. не как на картинке в примере, а так:

user posted image
PM MAIL ICQ Skype   Вверх
aleksandy
Дата 13.1.2011, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 1
Всего: 5



Для кнопки в таблице тебе нужен правильный TableCellRenderer, примеров коего в гугле пруд пруди.

А с чекбоксом не получилось потому, что в DefaultTableModel метод getColumnClass() для всех возвращает Object.
PM   Вверх
mgarin
Дата 13.1.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 19.8.2009
Где: Санкт-Петербург

Репутация: 2
Всего: 3



Самый простой пример:
Код
public class Example
{
    public static void main ( String[] args )
    {
        String[] columns = new String[]{ "1", "2" };
        Object[][] data = new Object[][]{ { "abc", "def" }, { "ghi", false } };

        JTable table = new JTable ( data, columns );
        table.setDefaultRenderer ( Object.class, new DefaultTableCellRenderer()
        {
            private JButton b = new JButton ();
            private JCheckBox cb = new JCheckBox ();

            public Component getTableCellRendererComponent ( JTable table, Object value,
                                                             boolean isSelected, boolean hasFocus,
                                                             int row, int column )
            {
                if ( value instanceof String )
                {
                    b.setText ( value.toString () );
                    return b;
                }
                else
                {
                    cb.setSelected ( ( Boolean ) value );
                    return cb;
                }
            }
        } );

        JFrame frame = new JFrame ();
        frame.getContentPane ().add ( new JScrollPane ( table ) );
        frame.pack ();
        frame.setLocationRelativeTo ( null );
        frame.setVisible ( true );
    }
}

PM MAIL WWW ICQ   Вверх
Skipy
Дата 13.1.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



Во-первых - рендерер, как уже сказал aleksandy. Пишется за 10 минут, и кнопку совсем не обязательно помещать в таблицу. 

Во-вторых - самостоятельная обработка клика на это поле. Тоже пишется за 10 минут.

В общем, ничего сложного.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
dorogoyIV
Дата 13.1.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



renderer
а про editor забыли?!
PM MAIL   Вверх
mgarin
Дата 13.1.2011, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 19.8.2009
Где: Санкт-Петербург

Репутация: 2
Всего: 3



Цитата(dorogoyIV @  13.1.2011,  13:37 Найти цитируемый пост)
а про editor забыли?! 

А про editor он пока не спрашивал ;)
Может ему только показывать надо

К тому же, editor ничем особо не отличается - то же самое создание компонента для отображения в таблице, только при входе на редактирование...
Просто с возможностью установки/редактирования/взятия определенного значения.

Это сообщение отредактировал(а) mgarin - 13.1.2011, 13:52
PM MAIL WWW ICQ   Вверх
Skipy
Дата 13.1.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



Цитата(dorogoyIV @ 13.1.2011,  13:37)
renderer
а про editor забыли?!

А зачем editor на поле с кнопкой??? Это по определению неизменяемое поле!


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
mgarin
Дата 13.1.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 19.8.2009
Где: Санкт-Петербург

Репутация: 2
Всего: 3



Цитата(Skipy @  13.1.2011,  16:07 Найти цитируемый пост)
А зачем editor на поле с кнопкой??? Это по определению неизменяемое поле! 

Как вариант - для возможности кликнуть по кнопке (да, не лучшее применение эдитору, но все же лучше чем просто обрабатывать клик, не отрисовывая нажатия кнопки. как минимум для пользователя хуже)
Как 2ой вариант - смена текста на кнопке, хотя ситуацию где это надо не могу даже представить smile
PM MAIL WWW ICQ   Вверх
НовыйСтиль
Дата 13.1.2011, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.12.2010
Где: Брест

Репутация: нет
Всего: нет



mgarin
Спасибо большое, всё классно работает.
а заместо едитора просто можно выводить месендж, уведомляющий что событие сработало.

PM MAIL ICQ Skype   Вверх
dorogoyIV
Дата 13.1.2011, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(Skipy @  13.1.2011,  16:07 Найти цитируемый пост)
А зачем editor на поле с кнопкой???

не на поле с кнопкой, а на ячейки таблицы.

а мне вот непонятно - зачем рендерер без эдитора? ну отрисуется кнопка, и что? зачем нужна нарисованная кнопка, если по ней кликнуть нельзя?
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.*;

public class Test extends JFrame
{
 public Test()
 {
  setDefaultCloseOperation(3);
  setBounds(100, 100, 400, 300);

  JTable table = new JTable(5, 3);
  table.getColumnModel().getColumn(0).setCellEditor(new MyEditor());
  table.getColumnModel().getColumn(0).setCellRenderer(new MyRenderer());

  Component c = new MyEditor().getTableCellEditorComponent(table,
                                                   null, true, 0, 0);
  table.setRowHeight(c.getPreferredSize().height);
  add(new JScrollPane(table));
 }

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

class MyEditor extends AbstractCellEditor
               implements TableCellEditor, ActionListener
{
 JTable table;
 JPanel jp = new JPanel();
 JButton jb = new JButton("button");

 MyEditor()
 {
  jp.add(jb);
  jb.addActionListener(this);
 }

 public void actionPerformed(ActionEvent e)
 {
  System.out.println(table.getSelectedRow());
 }

 public Component getTableCellEditorComponent(JTable table, Object value,
                                 boolean isSelected, int row, int column)
 {
  this.table = table;
  return jp;
 }

 public Object getCellEditorValue()
 {
  return null;
 }
}

class MyRenderer implements TableCellRenderer
{
 public Component getTableCellRendererComponent(JTable table, Object value,
                  boolean isSelected, boolean hasFocus, int row, int column)
 {
  return new MyEditor().getTableCellEditorComponent(table, value,
                                         isSelected, row, column);
 }
}

PM MAIL   Вверх
mgarin
Дата 14.1.2011, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 19.8.2009
Где: Санкт-Петербург

Репутация: 2
Всего: 3



Цитата(dorogoyIV @  13.1.2011,  22:42 Найти цитируемый пост)
а мне вот непонятно - зачем рендерер без эдитора? ну отрисуется кнопка, и что? зачем нужна нарисованная кнопка, если по ней кликнуть нельзя?

Ну, например, таблица отображающая соответствия LnF кнопок и их внешнего вида...
Вы никогда не угадаете, что может понадобиться

Если спросят об эдиторе - ответим, не спросят - значит есть что-то свое или же не надо вообще
Иначе так на каждый вопрос можно в ответ целое приложение с пачкой "нужных" фич поверх писать ;)

Добавлено через 26 секунд
P.S. Ну это лично мое мнение, каждый волен писать что хочет smile
PM MAIL WWW ICQ   Вверх
math64
Дата 14.1.2011, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



Лучше:
Код

class MyRenderer implements TableCellRenderer
{
  private MyEditor editor;
  public MyRenderer(MyEditor editor) {
    this.editor = editor;
  }
  public Component getTableCellRendererComponent(JTable table, Object value,
                  boolean isSelected, boolean hasFocus, int row, int column)
  {
    return editor.getTableCellEditorComponent(table, value, isSelected, row, column);
  }
}

Или даже:
Код

class MyEditorAndRenderer extends AbstractCellEditor
               implements TableCellEditor, ActionListener, TableCellRenderer {
  ...
}


Это сообщение отредактировал(а) math64 - 14.1.2011, 10:45
PM   Вверх
dorogoyIV
Дата 14.1.2011, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



math64,  конечно  smile 
лишний раз писать new как то стремно...
это я на работу опаздывал - некогда было расписывать 
а последнее твое редактирование вообще понравилось  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0914 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.