How to get JTextArea requestFocus

Answered

When I use JBPopupFactory.getInstance().createComponentPopupBuilder to make a Popups, I can't do any thing in my JTextArea? How can I fix it?

public class RouseAssistantAction extends AnAction {

    @Override
    public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
        System.out.println("双击Alt唤醒智能助手");
        // 创建需要执行的任务
        Project project = anActionEvent.getProject();
        if (null == project) {
            return;
        }
        AssistantUi assistantUi = new AssistantUi(project);
        JBPopup jbPopup = JBPopupFactory.getInstance().createComponentPopupBuilder(assistantUi, null).createPopup();
        jbPopup.showCenteredInCurrentWindow(project);
    }
}

 

public class AssistantUi extends JPanel {

    private final AssistantInputUi assistantInputUi;
    private final Dimension dimension = new Dimension(400, 300);

    public AssistantUi(Project project) {
        setLayout(new GridBagLayout());
        setSize(dimension);
        assistantInputUi = new AssistantInputUi(project);
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.gridy = 0;
        c.gridx = 0;
        c.gridwidth = 1;
        c.weightx = 1;
        add(assistantInputUi, c);
    }
}

 

public class AssistantInputUi extends JPanel {

    private static final String PLACEHOLDER = "请描述你的需求";

    private Project project;
    private JTextArea inputArea;
    private JScrollPane jbScrollPane;
    private JLayeredPane layeredPane;

    public AssistantInputUi(Project project) {
        this.project = project;
        this.initComponents();
        this.addListener();
    }

    /**
     * 注册监听事件
     * @author cms
     * @since 2024年12月11日15:49:17
     */
    public void addListener() {
        // 添加输入框键盘事件监听
        inputArea.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    if (!e.isControlDown() && !e.isMetaDown()) {
                        if (e.getModifiersEx() == 0) {
                            e.consume();
                            // TODO 根据输入内容提交给AI模型
                        }
                    } else {
                        e.consume();
                        inputArea.insert("\n", inputArea.getCaretPosition());
                    }
                    inputArea.revalidate();
                }
            }
        });

        inputArea.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                if (inputArea.getText().equals(PLACEHOLDER)) {
                    inputArea.setText("");
                }
            }

            @Override
            public void focusLost(FocusEvent e) {
                if (inputArea.getText().isEmpty()) {
                    inputArea.setText(PLACEHOLDER);
                }
            }
        });
        // 添加输入框鼠标点击事件监听
        inputArea.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (inputArea.getText().equals(PLACEHOLDER)) {
                    inputArea.setText("");
                }
            }
        });

    }

    private void initComponents() {

        layeredPane = new JLayeredPane();
        inputArea = new JTextArea();
        jbScrollPane = new JScrollPane();
        inputArea.setBackground(AiUiUtil.getEditorBg());
        inputArea.setForeground(JBColor.BLACK);
        inputArea.setLineWrap(true);
        inputArea.setWrapStyleWord(true);
        inputArea.setBorder(JBUI.Borders.emptyRight(15));
        inputArea.requestFocus();
//        inputArea.setFont();
        setToolTipText("福小智");

        jbScrollPane.setAutoscrolls(true);

        inputArea.setText(PLACEHOLDER);
        inputArea.setColumns(20);
        inputArea.setRows(1);
        jbScrollPane.setViewportView(inputArea);

        layeredPane.setLayer(jbScrollPane, javax.swing.JLayeredPane.DEFAULT_LAYER);

        javax.swing.GroupLayout layeredPaneLayout = new javax.swing.GroupLayout(layeredPane);
        layeredPane.setLayout(layeredPaneLayout);
        layeredPaneLayout.setHorizontalGroup(
                layeredPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jbScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 542, Short.MAX_VALUE)
        );
        layeredPaneLayout.setVerticalGroup(
                layeredPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layeredPaneLayout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(jbScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 38, Short.MAX_VALUE)
                                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(layeredPane)
        );
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                                .addComponent(layeredPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(0, 0, Short.MAX_VALUE))
        );
    }

}

 

 

0
1 comment

Try:

AssistantUi assistantUi = new AssistantUi(project);
JBPopup jbPopup = JBPopupFactory.getInstance().createComponentPopupBuilder(assistantUi, null)
    .setRequestFocus(true)
    .setFocusable(true)
    .createPopup();

Also, try to pass your JTextArea into createComponentPopupBuilder as preferableFocusComponent.

0

Please sign in to leave a comment.