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?
- Rejestracja:ponad 11 lat
- Ostatnio:około rok
- Postów:178
- Rejestracja:ponad 11 lat
- Ostatnio:około rok
- Postów:178
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ć ?
- Rejestracja:ponad 11 lat
- Ostatnio:około rok
- Postów:178
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)
- Rejestracja:ponad 11 lat
- Ostatnio:około rok
- Postów:178
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
- Rejestracja:około 12 lat
- Ostatnio:ponad 5 lat
- Nadajesz nazwę komponentom, żeby je zidentyfikować poprzez metodę setName
- Pobierasz komponent, który ma focus dzięki metodzie getFocusOwner
- Ż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);
- Rejestracja:ponad 11 lat
- Ostatnio:około rok
- Postów:178
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]
- Rejestracja:ponad 11 lat
- Ostatnio:około rok
- Postów:178
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())

- Rejestracja:prawie 17 lat
- Ostatnio:prawie 5 lat
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
.
- Rejestracja:ponad 11 lat
- Ostatnio:około rok
- Postów:178
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ć

- Rejestracja:prawie 17 lat
- Ostatnio:prawie 5 lat
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());
}
}
- Rejestracja:ponad 11 lat
- Ostatnio:około rok
- Postów:178
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 ?

- Rejestracja:prawie 17 lat
- Ostatnio:prawie 5 lat
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.