Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java.awt.BasicStroke设置虚线动画_Java_Animation_Graphics_Awt - Fatal编程技术网

使用java.awt.BasicStroke设置虚线动画

使用java.awt.BasicStroke设置虚线动画,java,animation,graphics,awt,Java,Animation,Graphics,Awt,是否有一种方法可以使用java.awt中的BasicStroke生成动画虚线?我希望有一条运行的虚线,就像photoshop的矩形选框工具的线条动画一样。使用虚线、一个线程(或一个Swing定时器)),并将它们与重新绘制()和一些调整虚线开始和结束的位置相结合,就这样了 例子 封装测试; 导入java.awt.BasicStroke; 导入java.awt.Color; 导入java.awt.Graphics2D; 导入java.awt.Shape; 导入java.awt.event.Acti

是否有一种方法可以使用java.awt中的BasicStroke生成动画虚线?我希望有一条运行的虚线,就像photoshop的矩形选框工具的线条动画一样。

使用虚线、一个
线程(或一个Swing
定时器)
),并将它们与
重新绘制()
和一些调整虚线开始和结束的位置相结合,就这样了

例子

封装测试;
导入java.awt.BasicStroke;
导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.awt.Shape;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.Rectangle2D;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.ImageIcon;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
公共类动画笔划{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
基本中风;
最终整数宽度=100;
最终整数高度=30;
最终缓冲区图像=新缓冲区图像(
宽度、高度、缓冲区图像。类型为_INT_ARGB);
最终JLabel标签=新JLabel(新图像图标(图像));
int pad=5;
最终形状矩形=新矩形2D.Double(
(双)垫,(双)垫,
(双)(宽度为2*pad),
(双倍)(高度-2*pad));
ActionListener=新建ActionListener(){
浮点数相位=0f;
浮点数[]={5.0f,5.0f};
@凌驾
已执行的公共无效行动(行动事件ae){
相位+=9.0f;
基本行程dashedStroke=新的基本行程(
1.5f,
BasicStroke.CAP_ROUND,
BasicStroke.JOIN_-MITER,
1.5f,//斜接极限
猛冲
dashPhase
);
Graphics2D g=image.createGraphics();
g、 setColor(Color.WHITE);
g、 fillRect(0,0,宽度,高度);
g、 设置颜色(颜色为黑色);
g、 设定行程(短行程);
g、 绘制(矩形);
g、 处置();
label.repaint();
/*

if(dashphase)如果可以生成虚线,则可以生成一个
线程(或一个Swing
计时器)和
重绘()
和一些破折号开始和结束位置的调整-应该可以实现它。@AndrewThompson:
BasicStroke
类有一个破折号阶段属性,可以用于此目的。@lhbloti啊,
破折号阶段
-很好的选择。@trashgod知道一个非常容易识别的动画边框的通用名称/历史很好。还有“蚂蚁”这个名字真是太神奇了(放牧、农业、建造复杂的结构……我只是希望它们不会很快在工具包中“着火”);)Java 7有一个新的名字。你不需要再自己画了。
package test;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class AnimatedStroke {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                BasicStroke dashedStroke;
                final int width = 100;
                final int height = 30;
                final BufferedImage image = new BufferedImage(
                        width,height,BufferedImage.TYPE_INT_ARGB);
                final JLabel label = new JLabel(new ImageIcon(image));
                int pad = 5;
                final Shape rectangle = new Rectangle2D.Double(
                        (double)pad,(double)pad,
                        (double)(width-2*pad),
                        (double)(height-2*pad));

                ActionListener listener = new ActionListener() {

                    float dashPhase = 0f;
                    float dash[] = {5.0f,5.0f};
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        dashPhase += 9.0f;
                        BasicStroke dashedStroke = new BasicStroke(
                                1.5f,
                                BasicStroke.CAP_ROUND,
                                BasicStroke.JOIN_MITER,
                                1.5f, //miter limit
                                dash,
                                dashPhase
                                );
                        Graphics2D g = image.createGraphics();

                        g.setColor(Color.WHITE);
                        g.fillRect(0,0,width,height);

                        g.setColor(Color.BLACK);
                        g.setStroke(dashedStroke);
                        g.draw(rectangle);

                        g.dispose();
                        label.repaint();
                        /*
                        if (dashPhase<100f) {
                            try {
                                ImageIO.write(
                                        image, 
                                        "PNG", 
                                        new File("img" + dashPhase + ".png"));
                            } catch(IOException ioe) {
                                // we tried
                            }
                        }*/
                    }
                };
                Timer timer = new Timer(40, listener);
                timer.start();
                JOptionPane.showMessageDialog(null, label);
            }
        });
    }
}