根据java Graphics2D drawString 描绘出的字符串得到字符串所围成成的矩形
各位大神好,这是小弟第一次提问题,因为是初学。我想通过javaGraphics2D相关类来实现以下功能:Graphics2D的drawString方法在图片上描绘了许多文...
各位大神好,这是小弟第一次提问题,因为是初学。
我想通过java Graphics2D相关类来实现以下功能:Graphics2D 的drawString方法在图片上描绘了许多文字,有些文字也是倾斜显示的(我通过Graphics2D 的rotate来做到的),但是有些文字有时候存在交叉重叠的现象,我想避免图片上有些文字重叠,只需要大神们告诉我如何判断会重叠就好。
目前已知信息是每个字符串的起始x、y坐标,终点x、y坐标,字符串宽、高。但是需要考虑的是字体大小调整后起始点坐标不会变,终点坐标就会伸缩有变化,所以考虑进去有必要。
小弟的想法是想根据字符串来得到所围成的矩形,然后通过待插入的字符串所为的矩形判断是否会与矩形相交,但是查阅API发现drawString方法返回值是void,所以又想通过数学中的几何图形特点来算,亦无果。
跪求大神们施以援手,谢谢! 展开
我想通过java Graphics2D相关类来实现以下功能:Graphics2D 的drawString方法在图片上描绘了许多文字,有些文字也是倾斜显示的(我通过Graphics2D 的rotate来做到的),但是有些文字有时候存在交叉重叠的现象,我想避免图片上有些文字重叠,只需要大神们告诉我如何判断会重叠就好。
目前已知信息是每个字符串的起始x、y坐标,终点x、y坐标,字符串宽、高。但是需要考虑的是字体大小调整后起始点坐标不会变,终点坐标就会伸缩有变化,所以考虑进去有必要。
小弟的想法是想根据字符串来得到所围成的矩形,然后通过待插入的字符串所为的矩形判断是否会与矩形相交,但是查阅API发现drawString方法返回值是void,所以又想通过数学中的几何图形特点来算,亦无果。
跪求大神们施以援手,谢谢! 展开
1个回答
展开全部
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
final class StringPaintDemo extends JFrame {
final static private Dimension SIZE = new Dimension(800, 600);
public String getTitle() {return "StringPaintDemo";}
public Dimension getPreferredSize() {return SIZE;}
public Dimension getMinimumSize() {return SIZE;}
public Dimension getMaximumSize() {return SIZE;}
public Dimension getSize() {return SIZE;}
private Canvas canvas;private JCheckBox checkBox;
private Brush brush;
StringPaintDemo() throws HeadlessException {
init();
attachListeners();
doLay();
setVisible(true);
}
private void init() {
brush=new StringBoundBrush();
canvas=new Canvas(brush);
checkBox=new JCheckBox("是否绘制文本边框?");
checkBox.addChangeListener(evt->{
brush.update(null, checkBox.isSelected());
});
}
private void attachListeners() {
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(1);
}
});
}
private void doLay() {
Container container=getContentPane();
container.add(canvas,BorderLayout.CENTER);
container.add(checkBox,BorderLayout.NORTH);
pack();
}
public static void main(String... args) {
System.setProperty("swing.defaultlaf", "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.invokeLater(StringPaintDemo::new);
}
private interface Brush extends Observer {
/**
* do paint action
* @param g the graphics context in you application
*/
void paint(Graphics g);
/**
* The component that this brush hold
* @return component instance
*/
Component getOwner();
void setOwner(Component owner);
}
private static final class StringBoundBrush implements Brush{
private Component owner;
private Object contentObj;
private boolean isBorderPainted=false;
public Component getOwner() {
return owner;
}
public void setOwner(Component owner) {
this.owner=owner;
}
public void paint(Graphics g) {
Graphics2D g2= (Graphics2D)g.create();
g2.fill(getOwner().getBounds());
g2.translate(100, 100);
g2.rotate(Math.PI / 3);
g2.setColor(Color.BLUE);
g2.setFont(g2.getFont().deriveFont(33f));
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
String s = contentObj ==null?"Null?": contentObj.toString();
if (isBorderPainted) {
g2.setColor(Color.ORANGE);
g2.draw(g2.getFontMetrics().getStringBounds(s, g2));
}
g2.setColor(Color.RED);
g2.drawString(s,0,0);
g2.dispose();
}
public void update(Observable o, Object arg) {
if(arg instanceof Boolean)
isBorderPainted= (boolean)arg;
else
contentObj = arg;
if (owner!=null) owner.repaint();
}
}
/**
* you canvas
*/
private class Canvas extends JComponent{
private Brush brush;
private Canvas(Brush brush) {
super();
this.brush=brush;
brush.setOwner(this);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (brush == null)return;
brush.paint(g);
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询