사용자가 각 텍스트 필드의 단일 문자로 입력한다고 가정합니다. 몇 가지 가능성이 있습니다 :
1) IconBorder를 만듭니다. 이렇게하면 제공된 아이콘을 텍스트 필드 위에 그릴 수 있습니다. 개념의 간단한 증거 :
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.border.*;
public class IconBorder implements Border
{
private Icon icon;
private Insets borderInsets = new Insets(0, 0, 0, 0);
public IconBorder(Icon icon)
{
this.icon = icon;
}
//
// Implement the Border interface
//
@Override
public Insets getBorderInsets(Component c)
{
return borderInsets;
}
@Override
public boolean isBorderOpaque()
{
return false;
}
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
{
icon.paintIcon(c, g, x+1, y+1);
}
private static void createAndShowUI()
{
JPanel panel = new JPanel();
panel.add(createTextField(new Ellipse2D.Double(0, 0, 30, 30)));
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
private static JTextField createTextField(Shape shape)
{
JTextField textField = new JTextField(1);
textField.setFont(new Font("Serif", Font.PLAIN, 18));
OutlineIcon icon = new OutlineIcon(shape, Color.RED, 2);
CompoundBorder inner = new CompoundBorder(textField.getBorder(), new EmptyBorder(5, 10, 5, 10));
CompoundBorder border = new CompoundBorder(new IconBorder(icon), inner);
textField.setBorder(border);
return textField;
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
위의 코드는 국경의 아이콘을 제공하기 위해 Playing With Shapes에있는 OutlineIcon
클래스를 사용합니다. 또는 거짓말을하는 "투명"아이콘을 사용할 수 있습니다.
하지만 알 수 있듯이 인세 트를 사용하여 텍스트를 올바르게 정렬하려고 시도하는 경우가 많습니다. Border 접근법을 사용하려면 "원 테두리"와 "사각형 테두리"를 만드는 것이 더 좋을 수 있습니다. 그러면 paintBorder (...) 메서드에서 직접 모양을 페인트하고 부모 컴퍼넌트의 사이즈
2) 또 다른 방법은 아이콘이있는 JLabel을 사용하는 것입니다. JLabel의 속성을 설정하면 텍스트가 가로 및 세로 가운데에 배치되어 레이블 위에 칠하도록 할 수 있습니다. 키보드 입력을 지원하려면 각 레이블을 포커스 가능하게 만들고 KeyListener를 추가하여 눌려진 키를 수신 한 다음 레이블의 텍스트를 설정해야합니다. (이 방법은 구성 요소의 크기가 사용하는 아이콘의 크기를 기반으로 쉽게 이루어지기 때문에 좋습니다.)
3) 또는 마지막으로 위와 같은 아이콘이있는 JLabel을 사용할 수 있습니다. 그런 다음 레이아웃 관리자를 BorderLayout으로 설정 한 다음 JTextField를 레이블에 추가 할 수 있습니다. JTextField를 불투명하게 만들 필요가 있습니다.
@ camickr - 위의 SSCCE와 OutlineIcon 클래스를 모두 복사하고 컴파일 할 수 있습니다. 사용할 수 있으려면 일부 공부가 필요할 것입니다. 그러나 그 점과 다른 2 가지 접근 방식에 대해서도 매우 잘 표현되고 설명되어 주셔서 감사합니다! – DSlomer64