'JComboBox'에 해당되는 글 2건

  1. 2022.03.24 Multiline combobox + word highlight
  2. 2021.12.23 JComboBox 키 입력시 툴팁 보이기

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

 

실행 화면

 

반응형
:

JComboBox 키 입력시 툴팁 보이기

프로그래밍/java 2021. 12. 23. 22:00
반응형

JComboBox 에 key listener 설정 하여 키 발생시 툴팁을 보여주는 코드

package test.swing;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

// key event tooltip
public class MainTest {
    public static void main(String[] args) {
        MainUI mainUI = new MainUI();
        mainUI.setVisible(true);
    }
}

class TestComboBox extends JComboBox {
    JTextField mTf = null;
    public TestComboBox() {
        super();
        mTf = (JTextField) editor.getEditorComponent();
        mTf.setToolTipText("TextField : ");
        mTf.addKeyListener(new KeyHandler());
    }

    class KeyHandler extends KeyAdapter {
        @Override
        public void keyReleased(KeyEvent e) {
            // set tooltip
            mTf.setToolTipText("TextField : " + mTf.getText());
            // show tooltip
            ToolTipManager.sharedInstance().mouseMoved(new MouseEvent(mTf, 0, 0, 0,0, 0, 0, false));
            super.keyReleased(e);
        }
    }
}

class MainUI extends JFrame {
    MainUI() {
        setPreferredSize(new Dimension(400, 300));
        setLayout(new FlowLayout());
        TestComboBox combo = new TestComboBox();
        combo.setToolTipText("ComboBox");
        combo.setEditable(true);
        add(combo);
        pack();
    }
}

 

 

반응형
: