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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как сделать UnDo, для текстовых компонентов 
V
    Опции темы
Swatch
Дата 9.8.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день.

Помогите, пожалуйста, надо сделать UnDo(Ctrl+Z) для текстовых компонентов на форме. то есть на форме лежит панелька с кард лайаутом в котором 28 карт. На кождой есть текстовые компоненты. Надо, чтобы при вводе текста в текстовый компонент была возможность, нажав в меню UnDo, отменить ввод (до 1 символа). ТО есть такая же реализация, как в Ворде и др. текстовых редакторах. Кто-нибудь знает, КАК это сделать??? smile  
PM MAIL   Вверх
goodday1941
Дата 9.8.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вешай кей листенер на текстовый компонент, при каждом нажатии клавищи вноси в LinkedList<String> текст с текстового компонента (текстовый компонент.getText()) при нажатии на кнопку undo берешь предпоследнюю запись с коллекции и делаешь текстовый компонент.setText(предпоследняя строка), потом удаляешь ее и последнюю запись. ну и тд...
впринцпе можно извратиться и еще redo написать smile, алгорим чуть посложнее будет

ПС.. писал первое что в голову пришло

Это сообщение отредактировал(а) goodday1941 - 9.8.2007, 16:34


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
fixxer
Дата 9.8.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здесь почитайте

еще можно почитать пакет javax.swing.undo

Это сообщение отредактировал(а) fixxer - 9.8.2007, 16:48


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


Новичок



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

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



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

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.util.Hashtable;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.Document;
import javax.swing.undo.UndoManager;


public class EasyEditor extends JPanel 
{    
    private JTextArea m_textanzeige; 
    private Hashtable<Object, Action> m_befehle;
    
    private JToolBar toolbar;
    private JButton kopieren;
    private JButton einfuegen;
    private JButton ausschneiden;    
    private JButton zuruck;
    private JButton vorwerts;
    
    private UndoManager undo;
        
    public EasyEditor()
    {
        this.setLayout(new BorderLayout());
        
        undo = new UndoManager();
        
        m_textanzeige = new JTextArea();
        m_textanzeige.setEditable(true);
        m_textanzeige.setCaretPosition(0);
        Document doc = m_textanzeige.getDocument();
        doc.addUndoableEditListener(new UndoableEditListener()
        {        
            public void undoableEditHappened(UndoableEditEvent e)
            {
                undo.addEdit(e.getEdit());
            }        
        });
        
        m_textanzeige.getActionMap().put("Undo", new AbstractAction("Undo")
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    if(undo.canUndo())
                        undo.undo();
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        
        });
        
        m_textanzeige.getActionMap().put("Redo", new AbstractAction("Redo")
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    if(undo.canRedo())
                        undo.redo();
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });    
        
        JScrollPane scroll = new JScrollPane();
        scroll.getViewport().add(m_textanzeige);    
     
        this.setPreferredSize(new Dimension(500,400));
        this.add(BorderLayout.CENTER,scroll);  
        this.add(BorderLayout.PAGE_START,getToolbar()); 
        
        getAusschneiden().addActionListener((Action) getMBefehle().get(DefaultEditorKit.cutAction));
        getkopieren().addActionListener((Action) getMBefehle().get(DefaultEditorKit.copyAction));
        getEinfuegen().addActionListener((Action) getMBefehle().get(DefaultEditorKit.pasteAction));
        getZuruck().addActionListener((Action) m_textanzeige.getActionMap().get("Undo"));
        getVorwerts().addActionListener((Action) m_textanzeige.getActionMap().get("Redo"));
    }
    
    private Hashtable<Object, Action> getMBefehle()
    {
        if(m_befehle == null)
        {
            m_befehle = new Hashtable<Object, Action>();
            Action[] actionsArray = m_textanzeige.getActions();
            for (int i = 0; i < actionsArray.length; i++) 
            {
                Action a = actionsArray[i];
                m_befehle.put(a.getValue(Action.NAME), a);
            }            
        }
        
        return m_befehle;
    }
    
    public JToolBar getToolbar()
    {
        if(toolbar == null)
        {
            toolbar = new JToolBar();    
            toolbar.setFloatable(false);

            toolbar.add(getkopieren());
            toolbar.add(getEinfuegen());
            toolbar.add(getAusschneiden());
            toolbar.addSeparator();
            toolbar.add(getZuruck());
            toolbar.add(getVorwerts());
        }
        
        return toolbar;
    }
    
    public JButton getkopieren()
    {
        if(kopieren == null)
        {
            kopieren = new JButton("copy");
        }
        
        return kopieren;
    }
    
    public JButton getEinfuegen()
    {
        if(einfuegen == null)
        {
            einfuegen = new JButton("paste");
        }
        
        return einfuegen;
    }
    
    public JButton getAusschneiden()
    {
        if(ausschneiden == null)
        {
            ausschneiden = new JButton("cut");
        }
        
        return ausschneiden;
    }
    
    public JButton getZuruck()
    {
        if(zuruck == null)
        {
            zuruck = new JButton("undo");
        }
        
        return zuruck;
    }
    
    public JButton getVorwerts()
    {
        if(vorwerts == null)
        {
            vorwerts = new JButton("redo");    
        }
        
        return vorwerts;
    }
    
    public String getText()
    {
        return m_textanzeige.getText();
    }
}

PM MAIL   Вверх
Swatch
Дата 10.8.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хммм... спасибо за пример. правда, что-то не доконца разобралась. у меня операция unDo должна выполняться из меню для компонентов, которые лежал на формах, которые, в свою очередь, находяться в кардлайауте. Чтобы найти компонент, который редактируется, я при приобретении им фокуса передаю его в глоб переменную component.
написала unDo так.:

Код

private void jTextArea2FocusGained(java.awt.event.FocusEvent evt) {                                       
// TODO add your handling code here:
        jTextArea2.setCaretPosition(0);
        Document doc = jTextArea2.getDocument();
        doc.addUndoableEditListener(new UndoableEditListener()
        {        
            public void undoableEditHappened(UndoableEditEvent e)
            {
                ((frmMain)this.getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent()).undoact.addEdit(e.getEdit());
            }        
        });
        ((frmMain)this.getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent()).component = jTextArea2;
    }  


а затем на глав. форме для менюшного действия unDo:

Код

private void undoActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
                try
                {
                    if(undoact.canUndo())
                        undoact.undo();
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }
     }


там же, на глав. форме объявлены :

Код

    public Component component;
    public UndoManager undoact;
    
     public frmMain() {
        initComponents(); 
        hibernateutil.getSessionFactory().getCurrentSession();
        undoact = new UndoManager();
    }


Дело в том, что у меня сейчас вообще ничего не запускается. Пишет: 

D:\Work\...\forms\NewPropertyforPurchase.java:375: cannot find symbol
symbol: method getParent()
                ((frmMain)this.getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent()).undoact.addEdit(e.getEdit());


Кто-ниюудь, подскажите, пожалуйста, что я сделала не так и почему он не находит метод getParent()??? ведь до этого он прекрасно все находил...  smile 

PM MAIL   Вверх
AlexeyVorotnikov
Дата 10.8.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Swatch @  10.8.2007,  10:52 Найти цитируемый пост)
((frmMain)this.getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent()).undoact.addEdit(e.getEdit());

Опупеть!

Где-то Вы в этих getParent() промахнулись.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Swatch
Дата 10.8.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В том-то и дело, что, допустим, вот эта строчка 

Код

((frmMain)this.getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent().getParent()).component = jTextArea2;


прекрасно работает...
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.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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