Java Swing - Edytor Tekstu

0

Witam serdecznie.

Mam do wykonania W Javie Edytor Tekstu, który ma wyglądać następująco:

http://www.users.pjwstk.edu.pl/~kb/Materialy/GUI/Jif.jpg

W dużej mierze poradziłem Sobie z wykonaniem zadania, lecz zostały pewne aspekty w których się zagubiłem.
Proszę was o szczerą pomoc.

  1. Chciałbym aby przy utworzeniu wewnętrznego okna JInternalFrame Fokus był ustawiony nie tylko na JTextArea lecz także na Okno.

  2. Podobnie chciałbym aby przy utworzeniu zakładki JTabbedPane Focus był ustawiony na nową zakładkę. Do tej pory ustawia sie wyłącznie na 1 zakładkę w każdej sytuacji. '
    Rozwiązaniem może być Listener na klasie Okien wewnętrznych i Zakładek?

  3. Zadania COPY, PASTE, CUT powinny być wykonywane przez akcje schowkowe z możliwością wywołania za pomocą klawiszy Ctrl-Insert, Ctrl-Delete, Shift-Insert.

Wiem, że to można wykonać za pomocą ActionMap i InputMap

ActionMap am = ta.getActionMap();  // ta - dowolny komponent JTextArea 
copyAction = am.get("copy-to-clipboard"); 
pasteAction = am.get("paste-from-clipboard"); 
cutAction = am.get("cut-to-clipboard");

Nie wiem jak tego użyć, dlatego zrobiłem sposób alternatywny. (Nie działa dla klawiszy Ctrl-Insert, Ctrl-Delete, Shift-Insert).

  1. Zapewnić w jakiś sposób zarządzanie wewnętrznymi oknami i zakładkami. Program dodaje okna wewnętrzne tylko do ostatnio utworzonej zakładki.

Oto kod:
Ze wzgledu na objetosc musiałem użyc do zamieszczenia innego serwisu.

http://www.sourcepod.com/tdgjcu89-6402

Liczę na wasza pomoc.
Z góry bardzo dziękuje.

1
es7infections napisał(a)
  1. Chciałbym aby przy utworzeniu wewnętrznego okna JInternalFrame Fokus był ustawiony nie tylko na JTextArea lecz także na Okno.

W funkcji newFile() dodaj wywołanie frame.setSelected(true)
Dodatkowo nie stosuj requestFocus(), która jest opisana w documentacji jako przestarzała (deprecated)
i zamiast niej należy stosować requestFocusInWindow()

        frame.moveToFront();
        try {
            frame.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {}
        frame.area.requestFocusInWindow(); 
1
es7infections napisał(a)
  1. Podobnie chciałbym aby przy utworzeniu zakładki JTabbedPane Focus był ustawiony na nową zakładkę. Do tej pory ustawia sie wyłącznie na 1 zakładkę w każdej sytuacji.

Dodaj wywołanie tab.setSelectedComponent(desktop)
uwaga co do requestFocus taka sama jak poprzednio.

    private void New_Workspace() {
        work++;
        desktop = new DESKTOP();
        desktop.add(new JDesktopPane());
        tab.add("Workspce " + work, desktop);
        tab.setSelectedComponent(desktop);
        tab.requestFocusInWindow();
    }

Przy czym tu masz to w ogóle źle zorganizowane.
Pole desktop jest zdefiniowane w klasie NOTEPAD, i teraz jak dodajesz nowy workspace,
to nadpisujesz to pole nowym obiektem i dodajesz nowe okna do tego obiektu.
A jak user kliknie sobie poprzedni workspace a potem nowe okno ?
To zamiast do bieżącego aktywnego workspace'a dodajesz te okno do tamtego niewidocznego ;)

Zmień funkcję newFile w ten sposób

    void newFile() {
        DESKTOP currentDesktop;
        
        frame = new FRAME("Untitled");
       
        // desktop.add(frame);
        if( null == ( currentDesktop = (DESKTOP)tab.getSelectedComponent() ))
        { // na wszelki wypadek
            New_Workspace();
            currentDesktop = (DESKTOP)tab.getSelectedComponent();
        }
        currentDesktop.add(frame);

Nie wiem czy w innych miejscach nie odwołujesz się do pola desktop,
jeśli tak, to trzeba to pozmieniać.

0

Twoja pomoc i zaangażowanie jest szlachetne jak brylant. : )

Udało się dokończyć zadanie.
Myślę, że to była bardzo przydatna lekcja.

Ogromne dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1