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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой JToggleButton в JTable (click не проходит) 
:(
    Опции темы
v7t4
Дата 12.3.2012, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет, 

это своего рода репост, потому что никак не найду решения http://stackoverflow.com/questions/9588384...o-a-jtable-cell 

Мне нужна была custom JToggleButton (с несколькими лейбалами внутри, примерный код ниже). Только когда я эту кнопу помещаю в ячейку таблицы click event срабатывает только после второго клика. Такое ощущение, что сначала фокус переходит на панельку внутри кнопки и только потом событие передаётся самой кнопке. Если удалить содержание кнопки, то всё работает. 

Может кто-нибудь подскажет, есть ли для этого воркэраунд или хак, чтобы сразу, с первого раза, кнопка получала событие click. Спасибо. 

Код


package sandbox;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractCellEditor;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class ClickableCustomButtonInTable extends JToggleButton {

    public ClickableCustomButtonInTable() {
        Dimension d = new Dimension(100, 100);
        JLabel lFirst = new JLabel("1st label");
        lFirst.setPreferredSize(d);

        JLabel lSecond = new JLabel("2nd label");
        lSecond.setPreferredSize(d);

        JPanel panel = new JPanel();
        panel.setOpaque(true);

        panel.setLayout(new BorderLayout());
        panel.add(lFirst, BorderLayout.NORTH);
        panel.add(lSecond, BorderLayout.SOUTH);
        add(panel); //if i comment this line out the click event gets triggered immediately as expected
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button clicked");
            }
        });
    }

    private static class CustomButtonRenderer implements TableCellRenderer {

        private final ClickableCustomButtonInTable button = new ClickableCustomButtonInTable();

        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            return button;
        }
    }

    private static class CustomButtonEditor extends AbstractCellEditor
            implements TableCellEditor {

        private final ClickableCustomButtonInTable button = new ClickableCustomButtonInTable();

        @Override
        public Object getCellEditorValue() {
            return button.getText();
        }

        @Override
        public Component getTableCellEditorComponent(JTable table,
                Object value, boolean isSelected, int row, int column) {
            return button;
        }

    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(new Dimension(200, 200));
        Container content = frame.getContentPane();
        TableModel model = new AbstractTableModel() {

            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                return null;
            }

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

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

            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return true;
            }

            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return ClickableCustomButtonInTable.class;
            }
        };

        JTable table = new JTable(model);
        // table.setBounds(new Rectangle(0, 0, content.getWidth(), content
        // .getHeight()));
        table.setRowHeight(frame.getHeight());
        table.setDefaultRenderer(ClickableCustomButtonInTable.class,
                new CustomButtonRenderer());
        table.setDefaultEditor(ClickableCustomButtonInTable.class,
                new CustomButtonEditor());

        content.add(table);
        content.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}


Это сообщение отредактировал(а) v7t4 - 12.3.2012, 12:35
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.0373 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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