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(); } }
실행결과

반응형