【问题标题】:Selecting / highlighting text in a JTextArea belonging to a JOptionPane在属于 JOptionPane 的 JTextArea 中选择/突出显示文本
【发布时间】:2015-03-11 12:39:24
【问题描述】:

我的问题如下:

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

我可以通过在 JTextArea 上调用 requestFocusInWindow() 然后调用 selectAll() 来正常执行此操作,但是当使用 JOptionPane 完成此操作时似乎存在问题,我猜这与焦点有关无法成功转移到 JTextArea。

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

1/2 类:主要

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);
    }
}

----------------------------------- ------------------------------
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);
    }

}

【问题讨论】:

  • Dialog focus 文章恰好涵盖了这一需求..
  • 我认为问题在于您在将JTextArea中的所有文本添加到选项面板之前将其聚焦并选择了它
  • @Andrew Thompson add(textArea);在 JOptionPane 中??? :-)
  • 我编辑了我的答案以使用 AncestorListener。这种方法的额外好处是用户可以立即开始在 TextArea 中输入。

标签: java swing user-interface jtextarea joptionpane


【解决方案1】:

只需添加

textArea.getCaret().setSelectionVisible(true)

textArea.selectAll();之后

【讨论】:

  • Magic:) 实际上,当 JTextComponent 获得焦点时,它会打开选​​择可见性,并在失去焦点时显示。我们做同样的事情,但没有重点。
  • 我明白了!那么,您是否建议将这种更直接的方法作为一般规则使用,而不是现在?
  • 实际上,我在需要显示选择而没有焦点的地方使用了方法。例如。搜索/替换。用户在 JTextArea 上方有焦点对话框(非模态),但仍突出显示选定的文本。
  • 1+、@quantum285、Thanks this works! - 然后不要忘记“接受”答案,这样人们就知道问题已经解决了。
  • 正如@StanislavL 提到的,当您不需要在 JTextArea 中获得焦点时,这是一个非常简洁的解决方案。如果您需要选择和关注两者,请使用 AncestorListener 查看我的答案。
【解决方案2】:

如果您希望将焦点放在 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);
}

【讨论】:

  • 似乎是一个有趣的想法,我需要研究 ComponentListeners 等,但这不起作用。
  • 非常感谢,您的编辑现在有效!你能解释一下 AncestorListener 是如何解决这个问题的吗?
  • Component.requestFocusInWindow() docs 说,“这个组件必须是可显示的、可聚焦的、可见的,并且它的所有祖先(除了顶级窗口)都必须可见,才能授予请求。 "等待ancestorAdded() 就可以做到这一点。见docs.oracle.com/javase/7/docs/api/java/awt/…
  • FWIW,我经常在 Swing 中发现,以正确的顺序执行操作需要将操作推迟到侦听器回调,在 SwingUtilities.invokeLater() 中执行,或两者都执行(侦听器回调稍后调用)。
  • 谢谢,到目前为止,这是最好的答案。 getCaret().setSelectionVisible(true) 方法意味着文本可能会被突出显示,但 JTextArea 实际上并没有被聚焦,而只是被突出显示,而这种方法允许完全选择和聚焦。
猜你喜欢
  • 2013-06-26
  • 1970-01-01
  • 2011-09-15
  • 2015-11-20
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多