Java 阻止边框对象后面的文本

Java 阻止边框对象后面的文本,java,swing,Java,Swing,我有一个JTextField,我想在它的右边显示一个验证图标,但是如果文本足够长,它会在图标下运行: 当图标显示在JTextField中时,如何避免这种情况 下面是一个简单的程序,它再现了这个问题: 导入java.awt.Color; 导入java.awt.Component; 导入java.awt.EventQueue; 导入java.awt.Font; 导入java.awt.FontMetrics; 导入java.awt.Graphics; 导入java.awt.Insets; 导入ja

我有一个JTextField,我想在它的右边显示一个验证图标,但是如果文本足够长,它会在图标下运行:

当图标显示在JTextField中时,如何避免这种情况

下面是一个简单的程序,它再现了这个问题:


导入java.awt.Color;
导入java.awt.Component;
导入java.awt.EventQueue;
导入java.awt.Font;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.awt.Insets;
导入javax.swing.JFrame;
导入javax.swing.JTextField;
导入javax.swing.border.AbstractBorder;
导入javax.swing.border.border;
导入javax.swing.border.CompoundBorder;
公共最终类边界扩展了JFrame{
公共边界(){
JTextField=新的JTextField();
Border outsideBorder=field.getBorder();
field.setBorder(新的复合边框(outsideBorder,新的AbstractBorder)(){
@凌驾
公共空白画框(组件c、图形g、整数x、整数y、整数宽度、整数高度){
Insets Insets=外部边界。getBorderInsets(c);
Font=c.getFont();
FontMetrics=c.getFontMetrics(字体);
int by=(c.getHeight()/2)+(metrics.getAscent()/2)-insets.top;
int bw=Math.max(2,insets.left);//边框宽度
int iw=metrics.stringWidth(==”);//图标宽度
int bx=x+宽度-(数学圆整(iw*1.5f)+(bw*2))+2;
g、 翻译(bx,by);
g、 setColor(Color.RED);
g、 setFont(c.getFont().deriveFont(Font.BOLD,Font.getSize());
g、 抽绳(“==”,x+(iw/2),y);
}
@凌驾
公共布尔值isborder不透明(){
返回true;
}
}));
添加(字段);
这个包();
}
公共静态void main(字符串[]args){
EventQueue.invokeLater(()->{
新边框().setVisible(true);
});
}
}
这是示例程序的结果:


生成第一个图像的代码已打开。

必须实现方法
getBorderInsets
。大概是这样的:

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.border.AbstractBorder;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;

public final class Borders extends JFrame {

    public Borders() {
        JTextField field = new JTextField();
        Border outsideBorder = field.getBorder();
        field.setBorder(new CompoundBorder(outsideBorder, new AbstractBorder() {

            @Override
            public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
                Insets insets = outsideBorder.getBorderInsets(c);
                Font font = c.getFont();
                FontMetrics metrics = c.getFontMetrics(font);
                int by = (c.getHeight() / 2) + (metrics.getAscent() / 2) - insets.top;
                int bw = Math.max(2, insets.left); // border width
                int iw = metrics.stringWidth("=="); // icon width
                int bx = x + width - (Math.round(iw * 1.5f) + (bw * 2)) + 2;
                g.translate(bx, by);
                g.setColor(Color.RED);
                g.setFont(c.getFont().deriveFont(Font.BOLD, font.getSize()));
                g.drawString("==", x + (iw / 2), y);
            }

            @Override
            public boolean isBorderOpaque() {
                return true;
            }

            @Override
            public Insets getBorderInsets(Component c, Insets insets) {
                insets.right = 15;
                return insets;
            }
        }));
        this.add(field);
        this.pack();
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new Borders().setVisible(true);
        });
    }

}

必须实现方法
getBorderInsets
。大概是这样的:

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.border.AbstractBorder;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;

public final class Borders extends JFrame {

    public Borders() {
        JTextField field = new JTextField();
        Border outsideBorder = field.getBorder();
        field.setBorder(new CompoundBorder(outsideBorder, new AbstractBorder() {

            @Override
            public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
                Insets insets = outsideBorder.getBorderInsets(c);
                Font font = c.getFont();
                FontMetrics metrics = c.getFontMetrics(font);
                int by = (c.getHeight() / 2) + (metrics.getAscent() / 2) - insets.top;
                int bw = Math.max(2, insets.left); // border width
                int iw = metrics.stringWidth("=="); // icon width
                int bx = x + width - (Math.round(iw * 1.5f) + (bw * 2)) + 2;
                g.translate(bx, by);
                g.setColor(Color.RED);
                g.setFont(c.getFont().deriveFont(Font.BOLD, font.getSize()));
                g.drawString("==", x + (iw / 2), y);
            }

            @Override
            public boolean isBorderOpaque() {
                return true;
            }

            @Override
            public Insets getBorderInsets(Component c, Insets insets) {
                insets.right = 15;
                return insets;
            }
        }));
        this.add(field);
        this.pack();
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new Borders().setVisible(true);
        });
    }

}

?@MadProgrammer ComponentBorder看起来很有趣。如果我需要更复杂的更改,我会记住这一点。@MadProgrammer ComponentBorder看起来很有趣。如果我需要更复杂的改变,我会记住这一点。谢谢。我使用了实际的字符串宽度来设置插图,但这为我指明了正确的方向。谢谢。我使用了实际的字符串宽度来设置插图,但这为我指明了正确的方向。