Java 11x11网格中的JTextField是否有一种方式可以拥有背景对象,例如圆形或正方形?
这里是我制作的Java 11x11网格中的JTextField是否有一种方式可以拥有背景对象,例如圆形或正方形?,java,shapes,Java,Shapes,这里是我制作的JTextField对象的11x11网格 颜色不错,但形状会更好(或两者都更好): 我认为没有任何方法可以将现有形状(例如.PNG)添加到JTextField或JPanel,是吗? 我该怎么办?我还没有进入图形课程,我现在不想去。但是,如果这是唯一的方法,好的。您可以将一个图像添加到。有一个This图标可能类似于,它有一个 我假设用户将键入每个文本字段的单个字符。有两种可能性: 1) 创建一个图标顺序。这将简单地在文本字段的顶部绘制您提供的图标。简单的概念证明: import
JTextField
对象的11x11网格
颜色不错,但形状会更好(或两者都更好):
我认为没有任何方法可以将现有形状(例如.PNG)添加到JTextField
或JPanel
,是吗?
我该怎么办?我还没有进入
图形
课程,我现在不想去。但是,如果这是唯一的方法,好的。您可以将一个图像添加到。有一个This图标
可能类似于,它有一个 我假设用户将键入每个文本字段的单个字符。有两种可能性:
1) 创建一个图标顺序。这将简单地在文本字段的顶部绘制您提供的图标。简单的概念证明:
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();
}
});
}
}
上面的代码使用中的OutlineIcon
类为边框提供图标。或者你也可以使用你周围的任何“透明”图标
但是,正如您所看到的,为了使文本正确对齐,有很多关于插图的游戏。如果要使用边界方法,最好创建“CircleBorder”和“SquareBorder”,然后可以直接在paintBorder(…)方法中绘制形状,并根据父组件的大小进行绘制
2) 另一种方法是使用带有图标的JLabel。您可以设置JLabel的属性,使文本水平和垂直居中,以便在标签顶部绘制。为了支持键盘输入,您需要使每个标签可聚焦,并添加一个KeyListener来监听所按下的键,然后设置标签的文本。(我喜欢这种方法,因为可以根据您使用的图标的大小轻松调整组件的大小)
3) 最后,您可以使用带有上述图标的JLabel。但是,您可以将布局管理器设置为BorderLayout,然后将JTextField添加到标签中。您需要使JTextField不不透明。@camickr--我复制了上面的SSCE和已编译的OutlineIcon类,我只能说我需要一些学习才能使用它。但是,感谢您这么做,也感谢其他两种表达和解释得非常好的方法!