Multiline combobox + word highlight

프로그래밍/java 2022. 3. 24. 22:09
반응형

Mulitline combobox - dynamic, ComboBoxEditor

word highlight - Highlighter

package test.swing;

import javax.swing.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import java.awt.*;
import java.awt.event.*;

class TextAreaComboBoxEditor implements ComboBoxEditor {
    private MyTextArea textArea = new MyTextArea();
    private JComboBox<String> mCombo;

    public TextAreaComboBoxEditor(JComboBox<String> combo) {
        mCombo = combo;
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);

        textArea.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("A " + mCombo.getPreferredSize().height + ", " + textArea.getPreferredSize().height);
                mCombo.setPreferredSize(new Dimension(mCombo.getPreferredSize().width, textArea.getPreferredSize().height));
                textArea.setUpdateHighlighter(true);
                mCombo.getParent().revalidate();
                mCombo.getParent().repaint();
            }
        });

        textArea.addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {

            }

            @Override
            public void focusLost(FocusEvent e) {
                textArea.setUpdateHighlighter(true);
            }
        });
    }

    @Override
    public Component getEditorComponent() {
        return textArea;
    }

    @Override
    public void setItem(Object anObject) {
        if (anObject instanceof String) {
            textArea.setText((String) anObject);
        } else {
            textArea.setText(null);
        }
    }

    @Override
    public Object getItem() {
        return textArea.getText();
    }

    @Override
    public void selectAll() {
        textArea.selectAll();
    }

    @Override
    public void addActionListener(ActionListener l) {
    }

    @Override
    public void removeActionListener(ActionListener l) {
    }

    class MyTextArea extends JTextArea {
        public void setUpdateHighlighter(boolean mUpdateHighlighter) {
            this.mUpdateHighlighter = mUpdateHighlighter;
        }

        private boolean mUpdateHighlighter = false;

        @Override
        public void paint(Graphics g) {
            if (mUpdateHighlighter) {
                Highlighter highlighter = getHighlighter();
                Highlighter.HighlightPainter painter1 = new DefaultHighlighter.DefaultHighlightPainter(Color.GREEN);
                Highlighter.HighlightPainter painter2 = new DefaultHighlighter.DefaultHighlightPainter(Color.LIGHT_GRAY);
                String text = getText();
                String separator = " ";

                try {
                    highlighter.removeAllHighlights();

                    int currPos = 0;
                    while (currPos < text.length()) {
                        int startPos = currPos;
                        int separatorPos = text.indexOf(separator, currPos);
                        int endPos = separatorPos;
                        if (separatorPos < 0) {
                            endPos = text.length();
                        }

                        if (startPos >= 0 && endPos > startPos) {
                            highlighter.addHighlight(startPos, endPos, painter1);
                        }

                        if (separatorPos >= 0) {
                            highlighter.addHighlight(separatorPos, separatorPos + 1, painter2);
                        }
                        currPos = endPos + 1;
                    }
                } catch (BadLocationException ex) {
                    ex.printStackTrace();
                }

                mUpdateHighlighter = false;
            }
            super.paint(g);
        }
    }
}

public class MainTest extends JFrame
{
    public MainTest()
    {
        setPreferredSize(new Dimension(400, 120));
        JComboBox<String> combo = new JComboBox<>();
        combo.setPreferredSize(new Dimension(100, 18));
        combo.setEditor(new TextAreaComboBoxEditor(combo));
        combo.setEditable(true);

        JPanel panel = new JPanel();
        panel.add(combo);
        this.add(panel);

        this.setTitle("combo Example");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainTest();
            }
        });
    }
}

 

실행 화면

 

반응형
: