选择/突出显示属于JOptionPane的JTextArea中的文本

时间:2015-03-11 12:39:24

标签: java swing user-interface jtextarea joptionpane

我的问题如下:

在我的应用程序中,用户单击一个按钮,弹出一个对话框(一个自定义的jOptionPane)。该对话框包含一个JTextArea,用户将在其中键入一个响应,然后由应用程序处理,但是我希望这个JTextArea(它将保存用户的输入并且当前包含示例文本,如“在此处写下你的答案”)到自动突出显示。

我可以正常做到这一点,通过在JTextArea上调用requestFocusInWindow()后跟selectAll(),但是当使用JOptionPane完成此操作时似乎存在问题,我猜测是关注焦点的事实无法成功转移到JTextArea。

我已经制作了一个SSCCE来清楚地证明这一点,并希望从你们其中一个人那里得到一个关于如何使这成为可能的答案。提前致谢!

Class 1/2:Main

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Main extends JFrame{


    public static void main(String[] args) {
        Main main = new Main();
        main.go();
    }

    private void go() {
        JPanel background = new JPanel();
        JPanel mainPanel = new ExtraPanel();
        ((ExtraPanel) mainPanel).setupPanel();
        JButton testButton = new JButton("Test the jOptionPane");
        testButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                optionPaneTest();
            }
        });
        background.add(mainPanel);
        background.add(testButton);
        getContentPane().add(background);
        pack();
        setVisible(true);

    }

    private void optionPaneTest() {
        JPanel testPanel = new ExtraPanel();
        ((ExtraPanel) testPanel).setupPanel();
        int result = JOptionPane.showConfirmDialog(null, testPanel,
                "This is a test", JOptionPane.OK_CANCEL_OPTION);
    }
}

----------------------------------------------- ------------------------------
Class 2/2:ExtraPanel

import javax.swing.JPanel;
import javax.swing.JTextArea;

public class ExtraPanel extends JPanel{

    public void setupPanel() {
        JTextArea textArea = new JTextArea();
        textArea.setText("Write your response here");
        textArea.requestFocusInWindow();
        textArea.selectAll();
        add(textArea);
    }

}

2 个答案:

答案 0 :(得分:2)

添加

textArea.getCaret().setSelectionVisible(true)

textArea.selectAll();之后

答案 1 :(得分:1)

如果您希望焦点在TextArea中以便用户可以立即开始输入,您可以使用祖先添加的事件触发选择。

public void setupPanel() {
    final JTextArea textArea = new JTextArea();
    textArea.setText("Write your response here");
    textArea.addAncestorListener(new AncestorListener() {
        public void ancestorRemoved(AncestorEvent event) { }
        public void ancestorMoved(AncestorEvent event) { }
        public void ancestorAdded(AncestorEvent event) {
            if (event.getSource() == textArea) {
                textArea.selectAll();
                textArea.requestFocusInWindow();
            }
        }
    });
    add(textArea);
}