我今天写这极时钟和我差不多完成exept我想我对齐类似于线内文字此.有谁知道如何做到这一点?我曾尝试使用FontRenderContext和字体指标,但我似乎无法让它工作.这是完整的源代码,因此您可以编译它并自己查看.
import java.applet.Applet;
import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.awt.geom.Arc2D;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.util.Calendar;
import java.util.TimeZone;
public class Clock extends Applet implements Runnable {
int[][] colorsInt = {{20,20,20},{100,100,50},{50,100,100},{10,170,50},{79,29,245},{24,69,234},{253,24,103}};
Color[] colors;
int size;
int radius;
boolean anitalias = false;
static final float HPI = (float)(Math.PI / 180f);
public void start() {
enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK); …Run Code Online (Sandbox Code Playgroud) 在核心Java书中,它说
getStringBounds方法返回的矩形的宽度是字符串的水平范围.矩形的高度是上升,下降和前导的总和.矩形的原点位于字符串的基线处.矩形的顶部y坐标是负的.因此,您可以获得字符串宽度,高度和上升,如下所示:
double stringWidth = bounds.getWidth();
double stringHeight = bounds.getHeight();
double ascent = -bounds.getY();
Run Code Online (Sandbox Code Playgroud)
当说矩形的原点位于字符串的基线时,作者的意思是什么,而顶部的y坐标是上升?
字符串的边界矩形从哪里开始?
用测试字符串我得到以下内容:
w: 291.0
h: 91.265625
x:0.0
y:-72.38671875
descent: 15.8203125
leading: 3.0585938
Run Code Online (Sandbox Code Playgroud)
这意味着矩形原点位于前导而不是基线,我对此是否正确?
我即将开始研究一个项目,该项目将生成一些带有alpha(渐变)的PNG,并希望在java中以编程方式绘制它们.
对于(一个简单的)示例,我想绘制一个框,添加一个阴影,然后将其保存到PNG文件,然后可以将其覆盖在其他图形上.
谢谢.
我想绘制矩形,只指定面板的高百分比,并且当我调整面板大小时,它应该调整自身大小.但我的问题是drawRect()只接受整数,所以当我尝试绘制矩形例如45%的面板高度时,如果面板高度小于100,它将转换为0.
我的代码很简单,所以你可以尝试一下.这是我的代码:
public class Drawer extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillRect(10,this.getHeight()-this.getHeight()/100*45, 100, this.getHeight()-this.getHeight()/100*45);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种通过2点绘制无限线(无线的线,也称为射线)的方法.我可以用Line2D在2点之间划一条线,这里没问题.
接下来,无限部分需要一看.用我简单的思维思考,让我们将第二个点的x和y坐标乘以100并重新绘制线条.这有效,但仅限于简单情况.
例如,这里是一个生成不同角度的线的情况:
g.setColor(Color.red);
g2.setStroke(new BasicStroke(4.0f));
g2.draw(new Line2D.Double(0, 61.632653061218946, 944, 217.25510204080692));
g.setColor(Color.blue);
g2.setStroke(new BasicStroke(1.0f));
g2.draw(new Line2D.Double(0, 61.632653061218946, 944*10, 217.25510204080692*10));
Run Code Online (Sandbox Code Playgroud)
这将首先绘制一条胖红线,接下来它将绘制一条蓝色细线.
与红线相比,蓝线具有不同的角度.这是一个截图来说明这种效果:

有人知道解决这个问题的方法吗,或者更好的方法是通过2分画出无限线?
我正在使用Java2D进行我正在编写的游戏,并且在我开始将其与其他swing组件集成之前没有遇到任何问题.我的问题是当我添加到JFrame的第一个组件不是我正在绘制的画布时,当我将鼠标悬停在文本窗格的滚动条上时,我会看到一个奇怪的神器.每次执行应用程序时都会发生这种情况.当我第一次使用画布时,没有问题.
出于某种原因,这似乎只发生在Windows上,当使用默认的Java2D管道时(恰好是sun.java2d.d3d = true),并且会发生工件.当我设置sun.java2d.opengl = true或sun.java2d.noddraw = false AND sun.java2d.d3d = false时,它不会发生.
我猜这是Direct3D Java2D管道的某种错误?我可以轻松地解决它,但很想知道是否有其他人遇到过这样的问题?我正在运行最新的JDK7u7,但它也适用于以前的版本.我应该注意,如果我最小化窗口并恢复它,那么工件就会消失,并且在我重新启动应用程序之前永远不会返回.
有神器:

没有工件(首先添加画布而不是JLabel图像):

如果有人对此有任何进一步的信息,我会很感激.谢谢!
我在阅读图像时遇到问题.如果我做以下事情
URL url = new URL("http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg");
ImageInputStream stream = ImageIO.createImageInputStream(url.openStream());
ImageReader reader = ImageIO.getImageReaders(stream).next();
reader.setInput(stream, true, true);
BufferedImage image = reader.read(0);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(bos);
writer.setOutput(ios);
IIOImage ioImage = new IIOImage(image, null, null);
writer.write(ioImage);
ios.close();
FileOutputStream fos = new FileOutputStream("badimage.jpeg");
fos.write(bos.toByteArray());
fos.close();
Run Code Online (Sandbox Code Playgroud)
图像用红色调写.是否有一些选项需要设置才能正确读取此图像?
我正在制作一个具有绘图板的应用程序,您可以在其中使用鼠标进行绘制,它会绘制在 BUfferedImage 中的标签之上。我现在正在尝试实现的是橡皮擦,问题是我找不到任何帮助将橡皮擦制作为 clearRect() 到 alpha 背景。(我无法定义颜色背景,因为用户可以将背景更改为他想要的任何图像)。总结:
以下是我的 DrawBoard 类,其中包含要绘制的所有内容。
public class DrawBoard extends JPanel implements MouseListener, MouseMotionListener{
public JLabel status;
private JLabel imgLabel; // this is where the drawing happens
public Point pstart, pfinish;
private List<Point> points = new ArrayList<Point>();
private List<BufferedImage> lines = new ArrayList<BufferedImage>();
private static final int BI_WIDTH = 1024;
private static final int BI_HEIGHT = 800;
private static int STROKESIZE = 7;
private BufferedImage bImage = new BufferedImage(BI_WIDTH, …Run Code Online (Sandbox Code Playgroud) 我写过图像处理代码,将像素数据复制成整数数组,如下所示:
void processImage(BufferedImage source) {
WritableRaster raster = source.getRaster();
int numBands = raster.getNumBands();
int height = raster.getHeight();
int width = raster.getWidth();
int[] pixelRow = new int[width * numBands];
for (int i = 0; i < height; i++) {
raster.getPixels(raster.getMinX(), raster.getMinY() + i, width, 1, pixelRow);
// do some processing
}
// create a new image
return newImage;
}
Run Code Online (Sandbox Code Playgroud)
该代码适用于我迄今为止测试过的图像.所述pixelRow阵列似乎总是接收的顺序的红,绿和蓝为与3个频带的图像(没有alpha通道)和像素分量的顺序红,绿,蓝和Alpha对于那些4个频带(alpha通道).
但是,我找不到任何说明这一点的说明.是否保证我将始终按顺序获取像素组件?有没有描述这个的规范?