Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 Swing JTextField setMargin意外行为_Java_Swing_Jtextfield - Fatal编程技术网

Java Swing JTextField setMargin意外行为

Java Swing JTextField setMargin意外行为,java,swing,jtextfield,Java,Swing,Jtextfield,当我调整窗口大小时,我的自定义JTextField会改变大小。它只会这样做一次,这是我第一次调整窗口的大小。它与paintComponent中的这一行相关: setMargin(新插图(2,25,2,2)) 在我调整窗口大小之前,运行该命令不会调整文本字段的大小。调整窗口大小后,运行该命令将导致JTextField变大。窗口的实际大小并不重要。第一次更改窗口大小时,JTextField变大,然后一直保持较大,直到时间结束。我更希望在我启动程序时,字段是大的,显然,我不希望它随机改变大小 如何固定

当我调整窗口大小时,我的自定义JTextField会改变大小。它只会这样做一次,这是我第一次调整窗口的大小。它与
paintComponent
中的这一行相关:

setMargin(新插图(2,25,2,2))

在我调整窗口大小之前,运行该命令不会调整文本字段的大小。调整窗口大小后,运行该命令将导致JTextField变大。窗口的实际大小并不重要。第一次更改窗口大小时,JTextField变大,然后一直保持较大,直到时间结束。我更希望在我启动程序时,字段是大的,显然,我不希望它随机改变大小

如何固定此JTextField的大小,使其不会随机更改?

以下是整个课程:

/**
 * From https://gmigdos.wordpress.com/2010/03/30/java-a-custom-jtextfield-for-searching/
 * @author Georgios Migdos <cyberpython@gmail.com> */
public class JIconTextField extends JTextField {

private Icon icon;
private Insets dummyInsets;

public JIconTextField(int columns) throws IOException {
    super(columns);

    Border border = UIManager.getBorder("TextField.border");
    JTextField dummy = new JTextField();
    this.dummyInsets = border.getBorderInsets(dummy);

    String path = "find-16x16.png";
    InputStream is = Main.class.getClassLoader().getResourceAsStream(path);
    setIcon(new ImageIcon(ImageIO.read(is)));
    repaint();
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    int textX = 2;

    if(this.icon!=null){
        int iconWidth = icon.getIconWidth();
        int iconHeight = icon.getIconHeight();
        int x = dummyInsets.left + 5;//this is our icon's x
        textX = x+iconWidth+2; //this is the x where text should start
        int y = (this.getHeight() - iconHeight)/2;
        icon.paintIcon(this, g, x, y);
    }

    setMargin(new Insets(2, textX, 2, 2));
}

}
/**
*从https://gmigdos.wordpress.com/2010/03/30/java-a-custom-jtextfield-for-searching/
*@作者Georgios Migdos*/
公共类JIconTextField扩展了JTextField{
私人图标;
私人插图Dummy插图;
公共JIconTextField(int列)引发IOException{
超级(列);
Border-Border=UIManager.getBorder(“TextField.Border”);
JTextField dummy=新的JTextField();
this.dummyInsets=border.getBorderInsets(虚拟);
String path=“find-16x16.png”;
InputStream=Main.class.getClassLoader().getResourceAsStream(路径);
设置图标(新图像图标(ImageIO.read(is));
重新油漆();
}
@凌驾
受保护组件(图形g){
超级组件(g);
int textX=2;
if(this.icon!=null){
int iconWidth=icon.getIconWidth();
int iconHeight=icon.getIconHeight();
int x=dummyInsets.left+5;//这是图标的x
textX=x+iconWidth+2;//这是文本应该从的x开始
int y=(this.getHeight()-iconHeight)/2;
icon.paintIcon(这个,g,x,y);
}
setMargin(新插图(2,textX,2,2));
}
}

关于注释,如果您从
paintComponent
方法中剪切代码并将其粘贴到构造函数中,您将获得所需的结果


实际绘制的
paintComponent
方法,即清空字段背景并绘制文本。通常,除非您特别想更改绘制组件的方式,否则不需要重写此方法。

为什么要在paintComponent方法中设置边距?这是最不寻常的,看起来很简略。代码的来源在OP的URL中。我不知道他为什么这样做。我在谷歌搜索如何在文本字段上绘制图标时遇到了这个问题。那么你到底想实现什么呢?与观察到的代码行为相比,您想要的代码行为是什么?我不希望我的文本字段随机改变大小。我想能够说“让我的文本字段这个大小”,然后不让它随机变化。请考虑更详细,并编辑您原来的问题与此信息。谢谢。如果有更好的方法在文本字段上绘制图标,请告诉我。@AtteJuvonen:如果你能准确地解释你想要达到的目标,我们会的。展示你所得到的东西的图像。请注意,这个答案只是重复了我的评论,这不是对Jimadilo的批评,而是告诉你,如果你想要一个更好的答案,比你立即提出问题时得到的更好的答案,请提出一个更好的问题。@AtteJuvonen:我实际上从未尝试过将图标直接添加到文本字段的图标中。你想让图标显示在正在键入的文本后面,还是显示在文本的侧面?在侧面,与OP中的链接中的方式相同。它现在可以工作了,我只是想知道这是否是一种不好的方式。