Wklejania w odpowiednim JTextField

0

Witam !
W swoim programie mam kilka pol tekstowych (JTextField) i próbuje ustawić tak, że za pomocą prawego przycisku myszy (JPopupMenu) wkleja mi dany tekst do jednego aktualnie zaznaczonego pola.
Niestety nie wiem jak to zrobić, bo przy JTextArea nie ma z tym problemu ponieważ jest funkcja Insert() ale wie ktoś może jak to zrobić w JTextField?

0

getText() => przeróbka Stringa => setText()

0

ale setText() wrzuca tekst do JTextFielda, który jest ustawiony odgórnie w kodzie a ja potrzebuje coś takiego co wklei tekst tam gdzie aktualnie znajduje się kursor.

0

zawołaj metodę

getFocusOwner()
0

a w jaki sposób wykorzystać tą funkcje bo za bardzo nie wiem?

Powinnienem chyba zacząć od:

Component A = getFocusOwner()

I co dalej ?

0

Np. ponazywaj komponenty(setName) a następnie na komponencie uzyskanym z metody getFocusOwner zawołaj getName

0

Mam dwa pola tekstowe JTextField i chce wkleić Stringa łańcuch do tego pola gdzie jest kursor czyli muszę to zrobić tak:

JTextField A = new JTesxtField("");     //wiadomo ze jeszcze im nadam rozmiar, polozenie itd
JTextField B = new JTesxtField("");
A.setName("PoleA")
B.setName("PoleB")

//Teraz bedzie funkcja obslugujaca wciśnienie klawisza
Component C = getFocusOwner();
String nazwa = C.getName()

Nie bardzo wgl to rozumiem, mógłbyś mi to "łopatologicznie" wyjaśnić ?

0
String nazwa = C.getName();
        switch(nazwa){
            case "PoleA":
                A.setText("Foo");
                break;
            case "PoleB":
                B.setText("Foo");
                break;
            //...
        }
0

Nie działa, wyskakują wyjątki.

0
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: empty String
	at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
	at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
	at java.lang.Double.parseDouble(Unknown Source)
	at MyFrame.actionPerformed(MyFrame.java:173)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
0

Tutaj:

 at MyFrame.actionPerformed(MyFrame.java:173)

Zabezpiecz się przed tym np w taki sposób:

fooString != null && fooString.length() > 0
0

No tak teraz nie wyskakuje błąd ale również nie wkleja się tekst to pola.
Wyswietliłem teraz tego Stringa nazwa i jest równy null.

Tak wgl to nie rozumiem jednej rzeczy:
co robi ta linijka

Component C = getFocusOwner();

bo ona chyba nie zmienia nazwy Componentu C, a potem porównujemy właśnie nazwę tego Componentu

0

może inny komponent niż myślisz ma focus

0

no nie wiem nie używałem wcześniej tej funkcji ale w dokumentacji jest napisane że zwraca obiekt Component

0
  1. Nadajesz nazwę komponentom, żeby je zidentyfikować poprzez metodę setName
  2. Pobierasz komponent, który ma focus dzięki metodzie getFocusOwner
  3. Żeby odróżnić, który to komponent sprawdzasz jego nazwę poprzez getName i dalej coś robisz

Wypisz najprościej co zwraca Ci getFocusOwner

System.out.println(C);
0
javax.swing.JButton[,100,150,100x20,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@e31770b,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Konwertuj,defaultCapable=true]
0

Mam dwa pola JTextField i chce żeby naciskając prawym przyciskiem myszy wybrać opcje Wklej i wklejało tekst tylko w to jedno pole w którym właśnie jest kursor.
Gdyby to były JTextArea wtedy nie ma problemu bo uzyl bym:

JTesxtAreas pole
pole.insert("tekst",pole.getCaretposition())
0

Gdyby były dwa JTextArea, to problem byłby taki sam. Problem wynika nie z typu komponentu, ale z tego że nie potrafisz rozpoznać, który komponent ma fokus.
Najprostsze rozwiązanie to wywołanie metody keyRelease z klasy Robot.

0

no w sumie masz racje. A wiesz może jak to rozwiązać ?
Bo mógłbym w sumie zrobić chyba osobne dwa menu popup dla jednego JTextField i osobne dla drugiego ale tak bym nie chciał tego rozwiązać.

0

A jak ta funkcje użyć ? Na jakiej zasadzie ona działa ?

0

Chyba wiem, mogę spróbować napisać. Ale moim zdaniem, to jest bardzo nieprzyjazne dla użytkownika rozwiązanie. Musi oderwać rękę od klawiatury, chwycisz mysz, przesunąć kursor i kliknąć. A wystarczy nacisnąć Ctrl+V.

1

A może napisać własnego focusListenera i w metodzie focusGained zapamiętywać referencję na komponent, który nas interesuje?

0
bogdans napisał(a):

Chyba wiem, mogę spróbować napisać. Ale moim zdaniem, to jest bardzo nieprzyjazne dla użytkownika rozwiązanie. Musi oderwać rękę od klawiatury, chwycisz mysz, przesunąć kursor i kliknąć. A wystarczy nacisnąć Ctrl+V.

może i tak ale chce jak najbardziej zbliżyć ten program to takiego zwykłego windowsowskiego i ctrl+C i ctrl+V działają ale zawsze jest opcja ręcznego zaznaczanie jezeli użytkownik pracowałby na myszce i chce takie coś dodać

0

Rozwiązanie z focusListenerem działa.

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

public class DwaPola extends JFrame implements ActionListener, FocusListener
{ 
    private JTextField first = new JTextField(16);
    private JTextField second = new JTextField(16);
    private JComponent last = null;
    public static void main(String[] args)
    {
        new DwaPola();
    }
    public DwaPola()
    {        
        setLayout(new FlowLayout(FlowLayout.CENTER));
        setTitle("Program");
        first.addFocusListener(this);        
        add(first);
        JButton b = new JButton("Wklej");
        b.addActionListener(this);
        add(b);
        second.addFocusListener(this); 
        add(second);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);        
    }
    public void actionPerformed(ActionEvent ae)
    {
        if(last instanceof JTextField)
        {
            JTextField tf = (JTextField)last;
            tf.setText(tf.getText()+" a hoj");
        }
    }
    public void focusGained(FocusEvent fe)
    {
    }
    public void focusLost(FocusEvent fe)
    {
        last = (JComponent)(fe.getSource());
    }    
}
0

Ok dzięki wielkie, ale mógłbyś mi wytłumaczyć co to jest "tf" dlaczego to tworzysz i jak to się dzieje że zawartosc tf jest potem w polach "first" lub "second" ?

To jest taki jakby "wskaźnik" na pole ostatnio odwiedzone przez kursor. Dobrze to rozumiem ?

0

W tym programie tak. Ogólnie last to referencja ( = jakby "wskaźnik") do ostatniego komponentu, który tracił fokus i do którego podpięto FocusListenera. Jeśli kursor jest w polu tekstowym, to to pole ma fokus. Gdy użytkownik klika w przycisk, to przenosi fokus na przycisk, zatem pole tekstowe traci fokus.

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