我编写这个程序是为了找到一种方法,可以String在BufferedImage 任何大小(在本例中,a 的大小与其inBufferedImage相同JPanel)和位置上绘制居中的 a 。当我调整 的大小时JFrame,文本会在重新定位时闪烁BufferedImage,我不知道为什么。
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
@SuppressWarnings("serial")
class test extends JPanel
{
double scale = 0;
String draw = "1";
test()
{
setPreferredSize(new Dimension(600, 600));
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
paintText(g2, 0, 0);
}
public void paintText(Graphics2D g, int x, int y)
{
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
BufferedImage bi = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D big = (Graphics2D) bi.getGraphics(); …Run Code Online (Sandbox Code Playgroud) 我使用下面的代码在java中打印ABC:
String NAME="ABC";
int FONT_SIZE=100;
BufferedImage image = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(new Color(255,255,255));
g.fillRect(0, 0, image.getWidth(), image.getHeight());
g.setColor(new Color(0,0,0));
g.setFont(new Font("arial", Font.PLAIN ,FONT_SIZE));
g.drawString(NAME,FONT_SIZE,FONT_SIZE);
g.dispose();
//write to file
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "PNG", out);
byte[] byteArray = out.toByteArray();
bytesToFile(byteArray,"D:/temp/pic/text/text.jpg");
Run Code Online (Sandbox Code Playgroud)
我得到结果图片:

我怎样才能在java中获得这种"羽毛效果"?(或任何其他java库)
感谢帮助 :)
我刚开始阅读O'Reilly的书籍Java2D Graphics.第一个例子是使用专有的com.sun类编写的,当然这些类是受限制的(我得到错误"由于对所需库rt.jar的限制而无法访问").
我应该用哪个图书馆代替com.sun.image.codec.jpeg?
书中的第一个例子有导入
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import java.awt.image.codec.JPEGImageDecoder;
Run Code Online (Sandbox Code Playgroud)
并像这样使用它们:
// Get the specified image.
InputStream in = getClass().getResourceAsStream(filename);
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
mImage = decoder.decodeAsBufferedImage();
in.close();
Run Code Online (Sandbox Code Playgroud) 我想BufferedImage用透明背景创建一个"戒指" .我可以用这样的透明背景绘制圆圈:
BufferedImage bi = new BufferedImage(d, d, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) bi.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(c);
g.fillOval(0, 0, d, d);
Run Code Online (Sandbox Code Playgroud)
但是现在我想在它的中间绘制一个较小的透明圆圈来制作一个戒指(所以当我在另一个图像上绘制这个图像时,不会绘制环周围和内部的像素).我想使用一个Graphics对象来做这个,所以我可以使用抗锯齿.
这可能吗?如果不是,那么解决这个问题的最佳方法是什么?
我是Swing和AWT的初学者,我正在寻找使用Netbeans构建GUI.我的GUI需要三个区域,我目前正在考虑将其作为JFrame上的JPanels.我需要一个"绘图"面板,它将监听鼠标输入并绘制Java2D形状.绘图面板将固定在左上角.另外两个区域是"属性"滚动窗格和"控制器"滚动窗格.控制器窗格将确定将通过按钮显示哪些绘制元素,属性滚动窗格将显示有关在绘图窗格中单击的任何形状对象的详细信息(端点,颜色等).
绘图区域的典型用例是绘图区域中的第一次点击将是形状的第一组坐标,IE:一条线.该点击将被捕获为point2d对象.第二次单击将是第二个point2D对象,并且将在两者之间构建一条线.控制器区域将具有"圆形","线","椭圆"等按钮.根据单击的控制器按钮,将仅在绘图区域中绘制该类型的形状.控制器和属性滚动窗格将不可移动,它们将分别锁定并可调整到GUI的底部和右侧.
作为初学者,我正在努力使用最好的组件.我一直在阅读JDesktop和JInternalFrame,但似乎我并不真的需要这一切.一个简单的JFrame有三个JPanel就足够了吧?更具体地说,我认为我需要一个顶级JFrame,一个JPanel用于绘图框架和两个JScrollPanels.我需要在绘图窗格上使用鼠标监听器来捕获每次单击的坐标,以及控制窗格中每个按钮的监听器.我可以在JPanel上放置一个鼠标监听器,并为其绘制Java2D形状,还是需要在JPanel内部使用不同的(更好的?)容器来进行绘图?
我有一个使用Netbeans的GUI构建器创建的JFrame,它只包含一个JPanel.我创建了一个getPanel获取此JPanel引用的方法:
public class ShowDrawings extends JFrame {
public ShowDrawings() {
initComponents();
}
public JPanel getPanel(){
return panel;
}
private JPanel panel;
}
Run Code Online (Sandbox Code Playgroud)
在我的主要功能中我正在做:
public class Main {
public static void main(String[] args){
ShowDrawings sd = new ShowDrawings();
sd.setSize(800, 600);
Graphics g = sd.getPanel().getGraphics();
g.setColor(Color.BLACK);
g.drawOval(400, 300, 50, 50);
sd.getPanel().paint(g);
sd.repaint();
sd.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
但它没有任何吸引力.请帮我.我已经看了一些相关的问题,但他们都建议扩展JPanel和覆盖其paint方法.但我不想这样做.谢谢.
我正在使用JButton的Action侦听器来绘制不同的形状.它工作正常,但如何在面板上保留以前绘制的形状?因为按下之前形状的另一个按钮已经消失.
jButton1.setText("Button1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jButton2.setText("Button2");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
s = evt.getActionCommand();
repaint();
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
s = evt.getActionCommand();
repaint();
}
Run Code Online (Sandbox Code Playgroud)
.......和paintComponent方法是
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("====>>> " + s);
switch (s) {
case "Button1":
g.drawRoundRect(20,20,40,40,100,200);
break;
case "Button2":
g.drawRect(0, 0, 200, 200);
break;
default:
g.drawOval(40, 40, …Run Code Online (Sandbox Code Playgroud) 我一直试图将我的java2d形状的中心与JPanel的中心对齐,但没有成功.我能够使用getBounds方法对图像和许多2D形状(如平行四边形)进行此操作,但对于菱形则不能,但所有这些都遵循相同的模式.很大程度上,当我从实际项目中准备一个SSCCE时,我可以正确对齐它们.我写了一个drawShape方法,用于在中心绘制形状.我不明白我哪里出错了.这是SSCCE:
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
public class TestPanel extends JPanel{
Point a,b,c,d;
Shape trapezium,parallelogram;
Random random=new Random();
public TestPanel(){
a=new Point();
b=new Point();
c=new Point();
d=new Point();
rhombusFactory(a,b,c,d);
trapezium=getQuadrilateral(a,b,c,d);
}
private void rhombusFactory(Point a,Point b,Point c,Point d)
{ int width=random.nextInt(200-100)+100;
int height=random.nextInt(150-50)+50;
a.x=0;
a.y=0;
b.x=a.x+width/2;
b.y=a.y+height/2;
c.x=a.x+width;
c.y=a.y;
d.x=a.x+width/2;
d.y=a.y-height/2;
}
private void parallelogramFactory(Point a,Point b,Point c,Point d){
int l1=random.nextInt(200-100)+100;
int l2=random.nextInt(150-70)+70;
int offset=(random.nextInt(2)==0?-1:1)*(random.nextInt(50-20)+20);
a.x=0;
a.y=0;
b.x=a.x+l1;
b.y=a.y;
d.x=a.x+offset;
d.y=a.y+l2;
c.x=d.x+l1;
c.y=d.y;
}
private Shape getQuadrilateral(Point …Run Code Online (Sandbox Code Playgroud) 我正在使用本网站的教程- "修正时间步"部分.
这是代码 - http://pastebin.com/QaHgcLaR
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GameLoopTest extends JFrame implements ActionListener
{
private GamePanel gamePanel = new GamePanel();
private JButton startButton = new JButton("Start");
private JButton quitButton = new JButton("Quit");
private JButton pauseButton = new JButton("Pause");
private boolean running = false;
private boolean paused = false;
private int fps = 60;
private int frameCount = 0;
public GameLoopTest()
{
super("Fixed Timestep Game Loop Test");
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
JPanel …Run Code Online (Sandbox Code Playgroud) 我的问题是我需要制作一个不断更新的GUI我得到的数据可以从数据库中更改,我在图形区域遇到了一些问题.
好吧我使用Graphics2D的Drawline和Drawstring来打印数据库中的值,这个字符串和行移动并改变值,所以我需要调用repaint(); 用一个计时器让它们在jpanel中运行,问题是repaint(); 在绘画之前没有删除背景中的旧画,但是当我完全调整所有更新时.
我知道一种清除的方法,但背景颜色也消失了,有一种方法可以更新jpanel去除旧画并保持沉闷的背景颜色?
没有更新

将coordenate和标签文本更改为"AXIS Y"后(从计时器自动调用重绘)

谢谢.