Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 11x11网格中的JTextField是否有一种方式可以拥有背景对象,例如圆形或正方形?_Java_Shapes - Fatal编程技术网

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类,我只能说我需要一些学习才能使用它。但是,感谢您这么做,也感谢其他两种表达和解释得非常好的方法!