'프로그래밍/java'에 해당되는 글 14건

  1. 2024.10.03 JDialog 에서 화면 출력전 JLabel 크기 확인 방법
  2. 2023.02.26 JTextField, JLabel 에서 text 변경 이벤트 처리하기
  3. 2022.08.10 String split 사용할때 빈값 삭제 / 유지 예제 코드
  4. 2022.06.15 JLabel 텍스트 컬러 변경 하기
  5. 2022.03.24 Multiline combobox + word highlight
  6. 2022.02.17 프로세스 실행 후 종료 확인 코드
  7. 2022.01.26 javadoc "error: package android.os does not exist" 에러가 날때
  8. 2022.01.06 Swing CustomLineBorder 만들기(top, left, bottom, right 지정하여 적용하기)
  9. 2021.12.28 JScrollPane 스크롤바 보이기/숨기기
  10. 2021.12.27 FlowLayout 에서 component 가 다음 라인으로 이동시 panel resize

JDialog 에서 화면 출력전 JLabel 크기 확인 방법

프로그래밍/java 2024. 10. 3. 21:35
반응형

JDialog 화면을 구성할때 JLabel 의 크기를 확인 해야 될 때가 있다.

JLabel 생성후 text를 설정을 해도 그 크기가 설정되지 않는다.

 

이때는 dialog panel을 설정한 후 pack() 을 호출하면 JLabel 의 크기가 설정이 되어 그 값을 읽어 올 수 있다.

그리고 나서 읽어들인 크기 값을 사용하여 필요한 UI를 만든 후 다시 panel 을 설정하면 된다.

 

JLabel 이 다른 컴포넌트와 붙어 있을 경우 창크기와 맞출때 사용한다.

contentPane.add(panel)
pack()

// mLabel의 크기를 확인 하고 mTestTF의 크기를 재설정한다.
mTestTF.preferredSize = Dimension(panelWidth - (mLabel.width + 5), mTestTF.preferredSize.height)

// 변경된 값의 적용을 위해 panel을 삭제/추가 한다
contentPane.remove(panel)
contentPane.add(panel)
pack()
반응형
:

JTextField, JLabel 에서 text 변경 이벤트 처리하기

프로그래밍/java 2023. 2. 26. 22:58
반응형

JLabel : PropertyChangeListener

JTextField : DocumentListener

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class TestClass {
    JLabel mLabel = new JLabel("TEST");
    JTextField mTextField = new JTextField("TEST");

    TestClass() {
        mLabel.addPropertyChangeListener(new MyChangeListener());
        mTextField.getDocument().addDocumentListener(new MyDocumentListener());
    }

    private class MyChangeListener implements PropertyChangeListener {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            if ("text".equals(evt.getPropertyName())) {

            }
        }
    }

    private class MyDocumentListener implements DocumentListener {
        @Override
        public void insertUpdate(DocumentEvent e) {

        }

        @Override
        public void removeUpdate(DocumentEvent e) {

        }

        @Override
        public void changedUpdate(DocumentEvent e) {

        }
    }
}
반응형
:

String split 사용할때 빈값 삭제 / 유지 예제 코드

프로그래밍/java 2022. 8. 10. 22:26
반응형

String split 사용할때 빈값 삭제 / 유지 예제 코드

        String test1 = "abc|aa|bb|cc||";

        String[] strArray = test1.split("\\|");
        System.out.println("1. test1 length :" + strArray.length);

        for (String str : strArray) {
            System.out.println("1. test1 : " + str);
        }

        System.out.println("");

        strArray = test1.split("\\|", -1);
        System.out.println("2. test1 length :" + strArray.length);

        for (String str : strArray) {
            System.out.println("2. test1 : " + str);
        }

 

실행 결과

1. test1 length :4
1. test1 : abc
1. test1 : aa
1. test1 : bb
1. test1 : cc

2. test1 length :6
2. test1 : abc
2. test1 : aa
2. test1 : bb
2. test1 : cc
2. test1 : 
2. test1 :

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-int-

 

String (Java Platform SE 8 )

Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argum

docs.oracle.com

 

반응형
:

JLabel 텍스트 컬러 변경 하기

프로그래밍/java 2022. 6. 15. 22:22
반응형

JLabel 사용시 html 태그를 사용하여 컬러를 변경

package test.swing;

import javax.swing.*;
import java.awt.*;

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

class MainUI extends JFrame {

    MainUI() {
        setPreferredSize(new Dimension(400, 300));
        setLayout(new FlowLayout());
        String text = "<html><font color=#FF0000>test</font>test" +
                "<font style=\"color: #FFFFFF; background-color: #0000FF\">test</font></html>";
        JLabel label = new JLabel(text);
        label.setToolTipText("");
        label.setPreferredSize(new Dimension(100, 100));
        add(label);
        pack();
    }
}

 

실행결과

반응형
:

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

 

실행 화면

 

반응형
:

프로세스 실행 후 종료 확인 코드

프로그래밍/java 2022. 2. 17. 22:18
반응형

java에서 process 실행 후 결과 값을 stream 으로 계속 읽어 들일때 process 가 종료 되면

readline 등의 메소드가 block 이 걸릴수 있다.

이때 process를 체크하는 thread를 따로 생성 후 모니터링 하여 종료를 체크 하여 필요한 동작을 처리 한다.

https://beradrian.wordpress.com/2008/11/03/detecting-process-exit-in-java/

 

Detecting process exit in Java

If you develop a more complex system, the chances of being a heterogeneous are pretty big. So if you develop a system in Java, but you have to integrate all ready build parts with other technology,…

beradrian.wordpress.com

 

    public void run() {
        try {
            // wait for the process to finish
            process.waitFor();
            // invokes the listeners
            for (ProcessListener listener : listeners) {
                listener.processFinished(process);
            }
        } catch (InterruptedException e) {
        }
    }
반응형
:

javadoc "error: package android.os does not exist" 에러가 날때

프로그래밍/java 2022. 1. 26. 22:58
반응형

javadoc 실행시 참조하는 패키지를 찾지 못할때 발생하는 에러로 javadoc 버전에 영향을 받음

최신 버전으로 사용할 경우 에러 발생함

 

/usr/lib/jvm/java-16-openjdk-amd64/bin/javadoc   => 에러 발생

error: package android.os does not exist
import android.os.RemoteException;

......

25 errors

 

패키지 경로를 추가하는 등의 방법으로 해결가능해 보이지만 수정에 한계가 있어 보임

꼭 javadoc 버전을 정해서 사용해야 되는 것이 아니라면 낮은 버전의 javadoc 사용으로 해결됨

/usr/lib/jvm/java-8-openjdk-amd64/bin/javadoc => 에러없이 문서가 만들어짐

                                                                                      갯수는 동일 하나 에러가 아닌 warning으로 처리됨

 

error: package android.os does not exist
import android.os.RemoteException;

......

25 warnings

반응형
:

Swing CustomLineBorder 만들기(top, left, bottom, right 지정하여 적용하기)

프로그래밍/java 2022. 1. 6. 22:58
반응형

생성시 지정된 면만 border 적용 하도록 border 재정의 함

나중에 같은 동작을 하는 MatteBorder 가 있다는 거 확인함.... 만들기 전에 찾아봐야돼~

https://docs.oracle.com/en/java/javase/17/docs/api/java.desktop/javax/swing/border/MatteBorder.html

package test.swing;

import javax.swing.*;
import javax.swing.border.AbstractBorder;
import java.awt.*;

// Custom Line border
public class MainTest {
    public static void main(String[] args) {
        MainUI mainUI = new MainUI();
        mainUI.setVisible(true);
    }
}

class CustomLineBorder extends AbstractBorder
{
    public static final int TOP = 0x1;
    public static final int LEFT = 0x2;
    public static final int BOTTOM = 0x4;
    public static final int RIGHT = 0x8;
    private Color mColor;
    private int mThickness;
    private int mTarget;

    public CustomLineBorder(Color colour, int thickness, int target)
    {
        mColor = colour;
        mThickness = thickness;
        mTarget = target;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
    {
        if (g != null)
        {
            g.setColor(mColor);
            if ((mTarget & TOP) != 0) {
                for (int i = 0; i < mThickness; i++) {
                    g.drawLine(x, y + i, width, y + i);
                }
            }
            if ((mTarget & LEFT) != 0) {
                for (int i = 0; i < mThickness; i++) {
                    g.drawLine(x + i, y, x + i, height);
                }
            }
            if ((mTarget & BOTTOM) != 0) {
                for (int i = 0; i < mThickness; i++) {
                    g.drawLine(x, height - i - 1, width, height - i - 1);
                }
            }
            if ((mTarget & RIGHT) != 0) {
                for (int i = 0; i < mThickness; i++) {
                    g.drawLine(width - i - 1, y, width - i - 1, height);
                }
            }
        }
    }

    @Override
    public Insets getBorderInsets(Component c)
    {
        return (getBorderInsets(c, new Insets(0, 0, 0, 0)));
    }

    @Override
    public Insets getBorderInsets(Component c, Insets insets)
    {
        insets.top = 0;
        insets.left = 0;
        insets.bottom = 0;
        insets.right = 0;
        if ((mTarget & TOP) != 0) {
            insets.top = mThickness;
        }
        if ((mTarget & LEFT) != 0) {
            insets.left = mThickness;
        }
        if ((mTarget & BOTTOM) != 0) {
            insets.bottom = mThickness;
        }
        if ((mTarget & RIGHT) != 0) {
            insets.right = mThickness;
        }

        return insets;
    }

    @Override
    public boolean isBorderOpaque()
    {
        return true;
    }
}

class MainUI extends JFrame {
    MainUI() {
        setPreferredSize(new Dimension(400, 420));
        
        JPanel pane = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 20));
        pane.setBackground(new Color(0x85, 0x85, 0x85));

        JLabel label = new JLabel("Red, 1, TOP");
        label.setPreferredSize(new Dimension(300, 40));
        label.setOpaque(true);
        label.setBackground(Color.WHITE);
        label.setBorder(new CustomLineBorder(Color.RED, 1, CustomLineBorder.TOP));
        pane.add(label);

        label = new JLabel("Red, 5, LEFT");
        label.setPreferredSize(new Dimension(300, 40));
        label.setOpaque(true);
        label.setBackground(Color.WHITE);
        label.setBorder(new CustomLineBorder(Color.RED, 5, CustomLineBorder.LEFT));
        pane.add(label);

        label = new JLabel("Red, 5, Bottom");
        label.setPreferredSize(new Dimension(300, 40));
        label.setOpaque(true);
        label.setBackground(Color.WHITE);
        label.setBorder(new CustomLineBorder(Color.RED, 5, CustomLineBorder.BOTTOM));
        pane.add(label);

        label = new JLabel("Red, 15, Right");
        label.setPreferredSize(new Dimension(300, 40));
        label.setOpaque(true);
        label.setBackground(Color.WHITE);
        label.setBorder(new CustomLineBorder(Color.RED, 15, CustomLineBorder.RIGHT));
        pane.add(label);

        label = new JLabel("Blue, 5, TOP LEFT");
        label.setPreferredSize(new Dimension(300, 40));
        label.setOpaque(true);
        label.setBackground(Color.WHITE);
        label.setBorder(new CustomLineBorder(Color.BLUE, 5, CustomLineBorder.LEFT | CustomLineBorder.TOP));
        pane.add(label);

        label = new JLabel("Blue, 5, TOP RIGHT BOTTOM");
        label.setPreferredSize(new Dimension(300, 40));
        label.setOpaque(true);
        label.setBackground(Color.WHITE);
        label.setBorder(new CustomLineBorder(Color.BLUE, 5, CustomLineBorder.TOP | CustomLineBorder.RIGHT | CustomLineBorder.BOTTOM));
        pane.add(label);

        add(pane);

        pack();
    }
}

실행결과

 

 

반응형
:

JScrollPane 스크롤바 보이기/숨기기

프로그래밍/java 2021. 12. 28. 22:52
반응형

setHorizontalScrollBarPolicy, setVerticalScrollBarPolicy 를 사용하여 설정

package test.swing;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;

// JScrollPane scrollbar show / hide
public class MainTest {
    public static void main(String[] args) {
        MainUI mainUI = new MainUI();
        mainUI.setVisible(true);
    }
}

class MainUI extends JFrame {
    JScrollPane scrollPane1 = null;
    JScrollPane scrollPane2 = null;
    JScrollPane scrollPane3 = null;
    JTable table1 = null;
    JTable table2 = null;
    JTable table3 = null;
    DefaultTableModel tableModel = null;

    MainUI() {
        setPreferredSize(new Dimension(400, 600));
        setLayout(new GridLayout(3, 1));

        System.out.println("JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED = " + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        System.out.println("JScrollPane.HORIZONTAL_SCROLLBAR_NEVER = " + JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        System.out.println("JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS = " + JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        System.out.println("JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED = " + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        System.out.println("JScrollPane.VERTICAL_SCROLLBAR_NEVER = " + JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        System.out.println("JScrollPane.VERTICAL_SCROLLBAR_ALWAYS = " + JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        table1 = new JTable();
        tableModel = (DefaultTableModel) table1.getModel();
        tableModel.addColumn("Column");
        tableModel.addRow(new Object[]{"SCROLLBAR_AS_NEEDED"});
        scrollPane1 = new JScrollPane(table1);
        add(scrollPane1);

        System.out.println("default h policy = " + scrollPane1.getHorizontalScrollBarPolicy() + ", v policy = " + scrollPane1.getVerticalScrollBarPolicy());

        table2 = new JTable();
        tableModel = (DefaultTableModel) table2.getModel();
        tableModel.addColumn("Column");
        tableModel.addRow(new Object[]{"HORIZONTAL_SCROLLBAR_NEVER"});
        tableModel.addRow(new Object[]{"VERTICAL_SCROLLBAR_ALWAYS"});
        scrollPane2 = new JScrollPane(table2);
        scrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        add(scrollPane2);

        table3 = new JTable();
        tableModel = (DefaultTableModel) table3.getModel();
        tableModel.addColumn("Column");
        tableModel.addRow(new Object[]{"HORIZONTAL_SCROLLBAR_ALWAYS"});
        tableModel.addRow(new Object[]{"VERTICAL_SCROLLBAR_NEVER"});
        scrollPane3 = new JScrollPane(table3);
        scrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane3.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        add(scrollPane3);

        pack();
    }
}

실행결과

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED = 30
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER = 31
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS = 32
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED = 20
JScrollPane.VERTICAL_SCROLLBAR_NEVER = 21
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS = 22
default h policy = 30, v policy = 20

반응형
:

FlowLayout 에서 component 가 다음 라인으로 이동시 panel resize

프로그래밍/java 2021. 12. 27. 22:31
반응형

Resize 이벤트 발생시 JPanel의 높이를 마지막 component 에 맞추는 코드

package test.swing;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

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

class MainUI extends JFrame {
    FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT, 0, 0);
    JPanel resizePane = new JPanel(flowLayout);
    JButton testBtn1 = new JButton("TEST 1");
    JButton testBtn2 = new JButton("TEST 2");
    JButton testBtn3 = new JButton("TEST 3");
    JButton testBtn4 = new JButton("TEST 4");
    JButton testBtn5 = new JButton("TEST 5");
    JComponent lastComponent = testBtn5;

    MainUI() {
        setPreferredSize(new Dimension(500, 300));
        setLayout(new BorderLayout());

        resizePane.setBackground(Color.BLUE);
        resizePane.addComponentListener(new ComponentAdapter() {
            Point prevPoint = null;

            @Override
            public void componentResized(ComponentEvent e) {
                super.componentResized(e);
                if (prevPoint == null || prevPoint.y != lastComponent.getLocation().y) {
                    System.out.println("lastComonent moved to " + lastComponent.getLocation());
                    resizePane.setPreferredSize(new Dimension(resizePane.getPreferredSize().width, lastComponent.getLocation().y + lastComponent.getHeight()));
                    resizePane.updateUI();
                }
                prevPoint = lastComponent.getLocation();
            }
        });

        resizePane.add(testBtn1);
        resizePane.add(testBtn2);
        resizePane.add(testBtn3);
        resizePane.add(testBtn4);
        resizePane.add(testBtn5);
        add(resizePane, BorderLayout.NORTH);

        JPanel pane = new JPanel();
        pane.add(new JLabel("TEST TEST"));
        add(pane, BorderLayout.CENTER);

        pack();
    }
}

최초 실행

JPanel 크기 변경 1

JPanel 크기 변경 2

반응형
: