Reputation: 117589
I want to set the focus on a specific JTextField which is passed to the JOptionPane as Object Message. Here is my code (I want the focus on txt2 but the focus always is on txt1):
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class TextArea extends JPanel
{
private JTextArea txt1 = new JTextArea();
private JTextArea txt2 = new JTextArea();
public TextArea()
{
setLayout(null);
setPreferredSize(new Dimension(200,100));
txt1.setBounds (20, 20, 220, 20);
txt2.setBounds (20, 45, 220, 20);
txt1.setText("Text Field #1");
txt2.setText("Text Field #2");
add(txt1);
add(txt2);
txt2.requestFocus();
}
private void display()
{
Object[] options = {this};
JOptionPane pane = new JOptionPane();
pane.showOptionDialog(null, null, "Title", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, txt2);
}
public static void main(String[] args)
{
new TextArea().display();
}
}
Upvotes: 5
Views: 16174
Reputation: 1524
You could use a workaround proposed in JDK-5018574 bug report.
Instead of
txt2.requestFocus();
use
txt2.addHierarchyListener(e -> {
if(e.getComponent().isShowing() && (e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0)
SwingUtilities.invokeLater(e.getComponent()::requestFocusInWindow);
});
I modified the solution to use Java 8 features. For older versions of Java, see the original workaround.
Upvotes: 0
Reputation: 324098
I gave you the answer in your last question (http://stackoverflow.com/questions/6475320/how-to-set-the-orientation-of-jtextarea-from-right-to-left-inside-joptionpane). The concept is the same. Think about the solution given and understand how it works so you can apply it in different situations.
If you still don't understand the suggestion then see DialogFocus for reusable code.
Upvotes: 3
Reputation: 420951
You could let the txt2
component request focus once it is added by overriding addNotify
. Like this:
private JTextArea txt2 = new JTextArea() {
public void addNotify() {
super.addNotify();
requestFocus();
}
};
Here's a fully functional / tested version of your program:
import java.awt.Dimension;
import javax.swing.*;
public class Test extends JPanel {
private JTextArea txt1 = new JTextArea();
private JTextArea txt2 = new JTextArea() {
public void addNotify() {
super.addNotify();
requestFocus();
}
};
public Test() {
setLayout(null);
setPreferredSize(new Dimension(200, 100));
txt1.setBounds(20, 20, 220, 20);
txt2.setBounds(20, 45, 220, 20);
txt1.setText("Text Field #1");
txt2.setText("Text Field #2");
add(txt1);
add(txt2);
}
private void display() {
Object[] options = { this };
JOptionPane pane = new JOptionPane();
pane.showOptionDialog(null, null, "Title", JOptionPane.DEFAULT_OPTION,
JOptionPane.PLAIN_MESSAGE, null, options, txt2);
}
public static void main(String[] args) {
new Test().display();
}
}
Upvotes: 6
Reputation: 285405
Why not use a JDialog or JFrame for this purpose?
public void display2() {
JDialog dialog = new JDialog(null, "Title", ModalityType.APPLICATION_MODAL);
dialog.getContentPane().add(this);
dialog.pack();
dialog.setLocationRelativeTo(null);
txt2.requestFocusInWindow();
dialog.setVisible(true);
}
Upvotes: 2