2014-04-26 2 views
0

여기에 내가 만든 JTextField 개의 11x11 격자가 있습니다.11x11 격자의 JTextField에 원이나 사각형과 같은 배경 개체가있는 방법이 있습니까?

Here's a grid I've made

색상이 좋은,하지만 모양은 더 나은 (또는 둘 다) 것 : 이 enter image description here

내가 (예를 들어, .PNG를 기존 모양을 추가 할 수있는 방법이라고 생각하지 않습니다)을 JTextField 또는 JPanel으로 변경 하시겠습니까? 어떻게해야합니까? 나는 아직 Graphics 클래스로 모험하지 않았고, 나는 지금 막 오히려하지 않을 것이다. 하지만 그게 유일한 방법이라면.

답변

1

사용자가 각 텍스트 필드의 단일 문자로 입력한다고 가정합니다. 몇 가지 가능성이 있습니다 :

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를 불투명하게 만들 필요가 있습니다.

+0

@ camickr - 위의 SSCCE와 OutlineIcon 클래스를 모두 복사하고 컴파일 할 수 있습니다. 사용할 수 있으려면 일부 공부가 필요할 것입니다. 그러나 그 점과 다른 2 가지 접근 방식에 대해서도 매우 잘 표현되고 설명되어 주셔서 감사합니다! – DSlomer64