Java 阻止边框对象后面的文本
我有一个JTextField,我想在它的右边显示一个验证图标,但是如果文本足够长,它会在图标下运行: 当图标显示在JTextField中时,如何避免这种情况 下面是一个简单的程序,它再现了这个问题: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
导入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看起来很有趣。如果我需要更复杂的改变,我会记住这一点。谢谢。我使用了实际的字符串宽度来设置插图,但这为我指明了正确的方向。谢谢。我使用了实际的字符串宽度来设置插图,但这为我指明了正确的方向。