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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вносить значения в ячейку JTable из JLables, запутался во всех этих слушателях 
V
    Опции темы
miroque
Дата 13.3.2013, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java EE developer



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

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



Здравствуйте.
Пишу собственный ученический проект. Но чтото я запутался во всех этих слушателях и событиях. Помогите разобраться как по умному сделать следующую задачу:
user posted image

На Главном окне, две Панели(выделено фиолетовой рамкой):
Вверху мой компонент MyComponent extends JPanel
Внизу JTable

в MyComponent 3 подпанельки (выделены красным), в каждой из панели ряд из JLabel с текстом (буква или цифра).

Результат работы: Выделяем ячейку, в ту которую хотим заносить символы. И нажимаем мышкой на JLabel с цифрой или буквой, и ее значение заносится в "активную" или "редактируемую" ячейку таблицы.

Вариант некой виртуальной клавиатуры. Только я что то запутался, кто из них должен быть слушателем, а кто события генерит. Или использовать шаблон проектирования "Наблюдатель"? сделать таблицу наблюдателем, а ряды с JLabels сделать субъектами? Но мне кажется можно воспользоваться уже готовыми Listeners, их в каждом из объектов на всякий случай жизни.

Помогите увидеть направление в какую сторону идти?
PM WWW Jabber   Вверх
dorogoyIV
Дата 13.3.2013, 12:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



как то так наверное:
Код

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

public class Main extends JFrame
{
    public Main()
    {
        JTable table = new JTable(5, 5);

        JPanel top = new JPanel(new BorderLayout());
        top.add(new MyPanel(27, table), "North");
        top.add(new MyPanel(22, table));
        top.add(new MyPanel(8, table), "South");
        add(top, "North");

        add(new JScrollPane(table));
    }
    
    public static void main(String [] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
        public void run() {
                Main main = new Main();
                main.setDefaultCloseOperation(3);
                main.setBounds(100, 100, 400, 500);
                main.setVisible(true);
            }
        });
    }
}

class MyPanel extends JPanel
{
    MyPanel(int labelsCount, JTable table)
    {
        super(null);
        setBorder(new LineBorder(Color.RED));
        int hgap = 4, vgap = 4;
        int x = 0, y = 0;
        int size = MyLabel.SIZE;

        for(int i = 0; i < labelsCount; i++)
        {
            int r = new Random().nextInt(26) + 65;
            MyLabel ml = new MyLabel((char)r, table);

            if(x > 10)
            {
                x = 0;
                y++;
            }
            ml.setBounds(x * (size + hgap) + hgap, y * (size + vgap) + vgap, size, size);
            add(ml);
            x++;
        }
        setPreferredSize(new Dimension((size + hgap) * 10 + hgap,
                        (y + 1) * (size + vgap) + vgap));
    }
}

class MyLabel extends JLabel
                  implements MouseListener
{
    public static int SIZE = 30;
    char text;
    private JTable table;

    MyLabel(char text, JTable table)
    {
        super(text + "", JLabel.CENTER);
        this.text = text;
        this.table = table;
        setPreferredSize(new Dimension(SIZE, SIZE));
        setBorder(new LineBorder(null));
        addMouseListener(this);
    }

    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}
    public void mouseClicked(MouseEvent e)
    {
        insertSymbol();
    }

    private void insertSymbol()
    {
        int row = table.getSelectedRow();
        int column = table.getSelectedColumn();

        if(row + column >= 0)
        {
            Object value = table.getValueAt(row, column);

            if(value == null)
                value = "";

            table.setValueAt(value.toString() + text, row, column);
        }
    }
}

PM MAIL   Вверх
miroque
Дата 14.3.2013, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java EE developer



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

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



dorogoyIV, спасибо за первую подскзаку!
Сейчас мало времени проверить и соединить решение с моим кодом.
Надеюсь получится проверить на выходных.

PM WWW Jabber   Вверх
miroque
  Дата 26.3.2013, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java EE developer



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

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



dorogoyIV, спасибо за подсказку!
Опробовал на выходных этот подход. И увидел, что да, Листенером должны быть эти вот самые "кнопки", которые JLabel. А я то думал что мне нужно реализовывать Листенер на Таблице. Вроде как, Таблица слушает, а нажал ли кто нибудь на "кнопку" и сама у себя смотрит а какая ячейка активная, и в нее записывать информацию с JLabel. Опробовал на практике, и получилось, что Листенером должны быть JLabel, в частности MouseListener.
А дальше основная подсказка еще вот в этом получилась
Код

    public void mouseClicked(MouseEvent e)
    {
        insertSymbol();
    }
    private void insertSymbol()
    {
        int row = table.getSelectedRow();
        int column = table.getSelectedColumn();
        if(row + column >= 0)
        {
            Object value = table.getValueAt(row, column);
            if(value == null)
                value = "";
            table.setValueAt(value.toString() + text, row, column);
        }
    }


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

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

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


 




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


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

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