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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не отслеживается состояние поля класса 
V
    Опции темы
kaa
Дата 13.4.2008, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В общем на правах новичка очередной глупый вопрос smile

Есть два класса, конструктор второго получает поле-объект( это там где getEdit()) первого и сохраняет в своей приватной переменной:

Код

class MainPanel extends JPanel{
    Editor edit;
    private ButtonWrapper Bold, Red, Underline, Italic; 
    JLabel label;
    private JMenuBar editorMenu;
    
    public MainPanel(){
        super();
        this.edit = new Editor();
        this.label = new JLabel();
        this.CreateEditorMenu();      
        this.edit = new Editor();
               
        this.setLayout(new GridLayout(3,1));
        
        add(this.editorMenu);
        add(this.edit);
        add(this.label);
        //add(this.officialMenu);
    }
    
    public Editor getEdit(){
        return this.edit;
    }
    
     /**
     *Функция создающая меню с элементами управления для редактора
     **/
    private void CreateEditorMenu(){
        this.editorMenu = new JMenuBar();
        
        this.Bold = new ButtonWrapper("Bold", "bold");
        this.Red = new ButtonWrapper("Red", "red");
        this.Underline = new ButtonWrapper("Underline", "underline");
        this.Italic = new ButtonWrapper("Italic", "italic");
        this.label = new JLabel("undefined");
        
        this.Bold.addActionListener(new ButtonClickHandler(this));
        this.Red.addActionListener(new ButtonClickHandler(this));
        this.Underline.addActionListener(new ButtonClickHandler(this));
        this.Italic.addActionListener(new ButtonClickHandler(this));
        
        this.editorMenu.add(this.Bold);
        this.editorMenu.add(this.Red);
        this.editorMenu.add(this.Underline);
        this.editorMenu.add(this.Italic);
        
    }
}


class ButtonClickHandler implements ActionListener{
    private MainPanel mainPanel;
    private Editor edit;
    private StyledDocument EditDoc;
    private int startSelect, endSelect, length;
    private Style bold, underline, red, italic;
    private String str, command;
    private ButtonWrapper sourceButton;
    
    /**
     *@param containerEdit.
     *объект-контейнер, содержащий редактор текста.
     */
    public ButtonClickHandler(MainPanel containerEdit){
        this.mainPanel = containerEdit;
        this.edit = containerEdit.getEdit();
       // this.edit = containerEdit.edit;
               
        this.EditDoc = this.edit.getStyledDocument();
        bold = this.EditDoc.addStyle("bold", null);
        underline = this.EditDoc.addStyle("underline", null);
        red = this.EditDoc.addStyle("red",null);
        italic = this.EditDoc.addStyle("italic",null);
        StyleConstants.setBold(bold, true);
        StyleConstants.setForeground(red, Color.RED);
        StyleConstants.setUnderline(underline, true);
        StyleConstants.setItalic(italic, true);      
    }
    
    public void actionPerformed(ActionEvent ae){
        
            this.mainPanel.label.setText(ae.getActionCommand());
            this.sourceButton = (ButtonWrapper)ae.getSource();
            this.command = sourceButton.getCommandString();
            this.startSelect = this.edit.getSelectionStart();
            this.mainPanel.label.setText(this.edit.getText());
            this.endSelect = this.edit.getSelectionEnd();
            this.length = this.endSelect-this.startSelect;
            if(length!=0){
                if(this.command=="underline"){
                    this.EditDoc.setCharacterAttributes(this.startSelect, length, underline, false);
                    this.mainPanel.label.setText("111");
                }
                else if(command=="bold"){
                    this.EditDoc.setCharacterAttributes(this.startSelect, length, bold, false);
                    this.mainPanel.label.setText("222");
                }
                else if(command=="red"){
                    this.EditDoc.setCharacterAttributes(this.startSelect, length, red, false);
                    this.mainPanel.label.setText("333");
                }
                else if(command=="italic"){
                    this.EditDoc.setCharacterAttributes(this.startSelect, length, italic, false);
                    this.mainPanel.label.setText("444");
                }
        }
  
    }
}



отслеживаются-ли изменения в редакторе проверяю в обработчике строкой 
Код

this.mainPanel.label.setText(this.edit.getText());


Так вот так изменений не видно, а если сделать:
Код

this.mainPanel.label.setText(this.mainPanel.edit.getText());

то изменения видно.

Никто не подскажет почиму? И как получить объект редактора так, чтобы отслеживались изменения его состояния в сохранённой переменной?

ЗЫ: Editor edit=== JTextPane
PM MAIL   Вверх
ivg
Дата 13.4.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Цитата(kaa @  13.4.2008,  20:13 Найти цитируемый пост)
Никто не подскажет почиму?

Потому что edit в MainPanel  и edit в ButtonClickHandler разные объекты. Удалите 12-ю строку.
PM MAIL   Вверх
kaa
Дата 14.4.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ivg, 
Ну, в общем у мя были подозрения на это, но позвольте вопрос. Разве когда выполняется присваиваение
Код

 this.edit = containerEdit.getEdit();

присваивается не ссылка на объект редактора, а делается полная егокопия на момент присваивания?
Я всегда думал что объекты по ссылке и передаются и присваиваются. Объясните пожалуйста.
PM MAIL   Вверх
ivg
Дата 14.4.2008, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Цитата(kaa @  14.4.2008,  08:52 Найти цитируемый пост)
объекты по ссылке и передаются и присваиваются

Всё правильно. Ошибка в другом.
Смотрите. В 9-ой строке вы инстанциируете объект Editor и присваиваете его значение полю edit класса MainPanel. Затем идет вызов CreateEditorMenu(), в котором создаются объекты ButtonClickHandler. В его конструкторе в 67 строке вы сохраняете ссылку на поле edit класса MainPanel. Заметьте, что это объект созданный в 9 строке. Ну а далее в 12 строке вы вновь создаете объект Editor и присваиваете его значение полю edit класса MainPanel. Таким образом 
Цитата(ivg @  13.4.2008,  20:47 Найти цитируемый пост)
edit в MainPanel  и edit в ButtonClickHandler разные объекты
.

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


Опытный
**


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

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



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

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

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


 




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


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

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