JAVA中画的图形不能显示,想知道问题出在哪?

package ObjectPrinciple;

import java.awt.EventQueue;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JToolBar;
import java.awt.BorderLayout;
import java.awt.Button;

import javax.swing.JPanel;
import javax.swing.JRadioButton;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JList;

public class DrawingBroad implements ItemListener{

private JFrame frame;
private Canvas canvas;
/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                DrawingBroad window = new DrawingBroad();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


    public void itemStateChanged(ItemEvent e) {
        JRadioButton rdb;
        rdb=(JRadioButton) e.getSource();//把获得的来源转换成单选按钮的类型
        //强制转换 事件是由哪个对象发出来的
        if(rdb.isSelected())//保证其中有一个按钮是被选中的
        {
            if (rdb.getText()=="Lines") {//也就是按钮的名称,做到匹配
            canvas.setTodoAction(0);//在中做得事件进行编号

            }
            else if (rdb.getText()=="rectangle") {
                canvas.setTodoAction(1);
            }
            else if (rdb.getText()=="circle") {
                canvas.setTodoAction(2);

            }//可以在此添加代码,新按钮
            else if (rdb.getText()=="move") {
                canvas.setTodoAction(100);
            }
        }
    }




/**
 * Create the application.
 */
public DrawingBroad() {//构造函数,
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 800, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JSplitPane splitPane = new JSplitPane();
    splitPane.setDividerLocation(160);
    frame.getContentPane().add(splitPane, BorderLayout.CENTER);

    canvas= new Canvas();
    splitPane.setRightComponent(canvas);


    JList<String> list = new JList<String>();
    splitPane.setLeftComponent(list);

    canvas.setLayers(list);

    JToolBar toolBar = new JToolBar();
    frame.getContentPane().add(toolBar, BorderLayout.NORTH);



    JRadioButton rdbtnLines = new JRadioButton("lines");
    rdbtnLines.setSelected(true);//首先选择一个按钮
    rdbtnLines.addItemListener(this);
    toolBar.add(rdbtnLines);

    JRadioButton rdbtnRectangle = new JRadioButton("rectangle");
    rdbtnRectangle.addItemListener(this);
    toolBar.add(rdbtnRectangle);

    JRadioButton rdbtnMove = new JRadioButton("move");
    rdbtnMove.addItemListener(this);
    toolBar.add(rdbtnMove);

    JRadioButton rdbtnCircle = new JRadioButton("circle");
    rdbtnCircle.addItemListener(this);
    toolBar.add(rdbtnCircle);


    ButtonGroup bg=new ButtonGroup();
    bg.add(rdbtnLines);
    bg.add(rdbtnRectangle);
    bg.add(rdbtnMove);
    bg.add(rdbtnCircle);






}

}
package ObjectPrinciple;

import java.awt.Color;

import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;

public class Canvas extends JPanel {
private int todoAction;
private Rectangle scope;
private ArrayList shapes;
private JList layers;

public void setLayers(JList<String> layers) {
    this.layers = layers;
}

public void setTodoAction(int todoAction) {
    this.todoAction = todoAction;
}

public Canvas() {

    shapes= new ArrayList<Shape>();
    addMouseMotionListener(mouseHandler);
    addMouseListener(mouseHandler);
}


public void paintShape(Shape s) {
    // TODO Auto-generated method stub
    shapes.add(s);
    String[] strings = new String[shapes.size()];
    int i=0;
    for (Shape shape:shapes) {
        strings[i++]=shape.toString();
    }
    layers.setListData(strings);    
    repaint(); 

}

private MouseInputListener mouseHandler = new MouseInputAdapter() {

    Point startPoint;

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        //初始化
        startPoint = e.getPoint();
        scope = new Rectangle();

    }



    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        //消除矩形框
        if(todoAction==100) {
            Moving m = shapes.get(layers.getSelectedIndex());
            m.move(e.getPoint().x, e.getPoint().y);

            scope = null;
            repaint();
        }
        else {

        setScope(startPoint,e.getPoint());
        if(scope.width > 0||scope.height>0)
            if(todoAction==0) {
                MyLine line = new MyLine();
                line.setShape(scope.x, scope.y, scope.width, scope.height, 0, "line");
                paintShape(line);
            }else if(todoAction == 1) {
                MyRectangle rectangle = new MyRectangle();
                rectangle.setShape(scope.x, scope.y, scope.width, scope.height, 1, "rectangle");
                paintShape(rectangle);
            }else if (todoAction == 2) {
                Circle circle= new Circle();
                circle.setShape(scope.x, scope.y, scope.width, scope.height, 2, "circle");
                paintShape(circle);
            }
        scope=null;
        repaint();
        }
    }
        @Override
        public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub


        if(scope==null) {
            setScope(startPoint, e.getPoint());
        }
        repaint();
        }











    private void setScope(Point starPoint,Point endPoint) {
        int x=Math.min(startPoint.x, endPoint.x);
        int y=Math.min(startPoint.y, endPoint.y);
        int w=Math.abs(startPoint.x - endPoint.x);
        int h=Math.abs(startPoint.y - endPoint.y);
        scope.setBounds(x,y,w,h);
    }

};

@Override
public void print(Graphics g) {
    // TODO Auto-generated method stub
    super.print(g);
    g.setColor(Color.BLACK);
    if(scope != null)
        g.drawRect(scope.x, scope.y, scope.width,scope.height);
//需要一个队列,需要把画的图形加到队列,调用每个元素的drawingshape方法
    for(Drawing d:shapes) {
        d.drawingShape(g);
    }
}

}

package ObjectPrinciple;

import java.awt.Graphics;

public interface Drawing {
public void drawingShape(Graphics g);
}
package ObjectPrinciple;

public interface Moving {
public void move(int x,int y);

}

package ObjectPrinciple;

public abstract class Shape implements Drawing,Moving{
//位置
int x,y;
//宽度,高度
int width,height;
int shapetype;
String shapename;
public void setShape(int x, int y, int width, int height, int shapetype, String shapename) {
//super();
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.shapetype = shapetype;
this.shapename = shapename;
}
@Override
public void move(int x, int y) {
// TODO Auto-generated method stub
this.x = x;
this.y = y;
}
@Override
public String toString() {
return shapename;
}

}
package ObjectPrinciple;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;

public class MyLine extends Shape {

public void drawingShape(Graphics g) {
    Graphics2D g2d=(Graphics2D) g;
    Line2D line2d = new Line2D.Double(x,y,x+width,y+height);

    g2d.draw(line2d);



}

}

package ObjectPrinciple;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;

public class MyRectangle extends Shape {

@Override
public void drawingShape(Graphics g) {
    // TODO Auto-generated method stub
    Graphics2D g2d=(Graphics2D) g;
    //Rectangle2D rect = new Line2D
    Rectangle2D rect = new Rectangle2D.Double(x,y,x+width,y+height);
    g2d.draw(rect);

}

}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于java中applet问题,我的程序无法在html中显示出来,请问哪出问题了。
该程序是要画一个余弦图形。 ``` import java.applet.*; import java.awt.*; public class test3 extends Applet { public void start() { int x,y; Graphics g=getGraphics(); for(x=0;x<=750;x++) { g.drawString(".",x,200); if(x<=385) g.drawString(".",360,x); } g.drawString("Y",330,200); for(x=360;x<=370;x++) { g.drawString(".",x-10,375-x); g.drawString(".",x,x-355); } g.drawString("X",735,230); for(x=740;x<=750;x++) { g.drawString(".",x,x-550); g.drawString(".",x,950-x); } for(x=0;x<=720;x++) { double a=Math.cos(x*Math. PI/180); y=(int)(200+80*a); g.drawString(".",x,y); } } } ``` ``` <html> <head> <title>余弦测试曲线</title> </head> <body> <applet code=test3.class width=900 height=600> </applet> </body> </html> ``` 出现的问题:我在浏览器上打开html文件,没有出现余弦图形。
我是JAVA菜鸟,想问问关于JAVA中JFrame和JPanel的问题
我现在在做一个画图工具,如何把画的的图形实现拖动,我的想法是在JPanel上再添加一个 JPanel,就是利用图层的原理来实现,就是创建一个Drawline的类继承JPanel来实现在这 JPanel上画直线,然后JFrame上的类已经添加了一个JPanel,然后我把Drawline添加到JPanel 上,然而为什么显示不出已经画的线
swing重绘按钮,在面板上可以显示,但是在绘画面板上面就显示不出来。
在做一个Java图形化界面的项目时发现重绘后按钮的按钮可以在面板上面显示, 但是在绘画面板上无法显示,但是普通的button可以在绘画 面板上面显示, 测试时候发现普通面板上面进入了重绘按钮的方法,但是在绘画面板只进入了类, 并没有实现重绘的方法,为什么?怎么解决?
想做一个类似画图板的.java,当点击circle,可以在panel画一个圆,现在遇到两个问题
用mvc设计模式,将elements为父类,圆,直线等作为其子类,各自有不同的draw()的方法; control是响应鼠标及按钮监听事件的类; Gui是界面,可以点击按钮,点击panel一点,拖动,另一点释放,实现作图 代码如下:以画直线和画矩形为例: 在panel做出的图形无法显示,不知道该怎么实现,新建一个mypic类,让它继承JPanel,但是没有出现@over 在line里设置了输出"你画了一条直线",为了检测是否实现mouse event. 点第一次“line", 出现"你画了一条直线"; 再点一次rectangle,会先出现"你画了一条直线"并且出现"你画了个矩形" 如果再点一次rectangle,会出现"你画了一条直线""你画了个矩形""你画了个矩形" 每一次都会重复再做一次,之前所有按钮监听的事件~ ``` package elements; import java.awt.Graphics; public class Line extends Elements { public int x1; public int y1; public int x2; public int y2; Graphics g; public Line(int x1, int y1, int x2, int y2) { super(x1, y1, x2, y2); this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; } @Override public void draw(Graphics g) { System.out.print("你画了一条直线"); g.drawLine( x1, x2, y1, y2); } } ``` ``` package control; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JPanel; import elements.Elements; import elements.Line; import elements.Rectangle; public class Control extends JPanel implements ActionListener, MouseListener, MouseMotionListener { private static final long serialVersionUID = 1L; public Graphics g; public JButton curcolor; public Color color; public void getGraphics(Graphics g) { this.g = g; } public void setG(Graphics g) { this.g= g; }//传递画笔 public void setcurcolor(JButton curcolor) { this.curcolor = curcolor; } public void setcolor(Color color) { this.color = color; } public String doit = ""; public int x1, y1, x2, y2; //鼠标的按下和释放时的坐标 ArrayList <Elements> drawX = new ArrayList <Elements>(); public void add(Elements picture) { drawX.add(picture); } public ArrayList<Elements> getDrawX() { return drawX; } public void setDrawX(ArrayList<Elements> drawX) { this.drawX = drawX; } @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("")) { JButton jb = (JButton) e.getSource(); color = jb.getBackground(); // System.out.println("red"); } else { doit = e.getActionCommand(); } } @Override public void mouseMoved(MouseEvent e) { } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); g.setColor(color); } @Override public void mouseReleased(MouseEvent e) { x2=e.getX(); y2=e.getY(); if ( doit.equals("rectangle")) { drawX.add(new Rectangle(x1, y1, x2, y2)); // doit = ""; } if ( doit.equals("line")) { drawX.add(new Line(x1, y1, x2, y2)); // doit = ""; } for (Elements sth : drawX) { sth.draw(g); } } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseDragged(MouseEvent e) { } } ``` ``` package elements; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public abstract class Elements extends JPanel { private static final long serialVersionUID = 1L; public Elements(int x1, int y1, int x2, int y2) { // TODO Auto-generated constructor stub } public void draw(Graphics g) { } } ``` package view; import java.awt.*; import javax.swing.*; import control.Control; import elements.Elements; import java.awt.event.*; import java.util.ArrayList; public class Gui extends JFrame { public Control drawit; Graphics g; private static final long serialVersionUID = 1L; public Gui() { JFrame frame = new JFrame("miniCAD"); JPanel panelBig = new JPanel();//画板 JPanel panelSmall = new JPanel();//图形和颜色板 JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelBig, panelSmall); panelBig.setBackground(Color.white); panelSmall.setBackground(Color.gray); pane.setRightComponent(panelSmall); pane.setLeftComponent(panelBig); pane.setContinuousLayout(true); pane.setOneTouchExpandable(true); frame.add(pane); // Container C = frame.getContentPane(); // C.add(pane); //添加图形 JButton buttoncircle = new JButton("circle"); JButton buttonline = new JButton("line"); JButton buttonrectangle = new JButton("rectangle"); JButton buttontext = new JButton("text"); JButton buttontriangle = new JButton("triangle"); frame.setVisible(true); panelSmall.setLayout(new GridLayout(6,1,0,0)); panelSmall.add(buttoncircle); panelSmall.add(buttonline); panelSmall.add(buttonrectangle); panelSmall.add(buttontext); panelSmall.add(buttontriangle); //添加颜色板 JPanel colorpane = new JPanel(); panelSmall.add(colorpane); colorpane.setLayout(new GridLayout(3,3)); JButton buttonred = new JButton(); buttonred.setBackground(Color.red); colorpane.add(buttonred); JButton buttonblack = new JButton(); buttonblack.setBackground(Color.black); colorpane.add(buttonblack); JButton buttonblue = new JButton(); buttonblue.setBackground(Color.blue); buttonblue.setContentAreaFilled(false); colorpane.add(buttonblue); JButton buttongreen = new JButton(); buttongreen.setBackground(Color.green); colorpane.add(buttongreen); JButton buttongray = new JButton(); buttongray.setBackground(Color.gray); colorpane.add(buttongray); JButton buttonwhite = new JButton(); buttonwhite.setBackground(Color.white); colorpane.add(buttonwhite); JButton buttonyellow = new JButton(); buttonyellow.setBackground(Color.yellow); colorpane.add(buttonyellow); JButton buttonpink = new JButton(); buttonpink.setBackground(Color.pink); colorpane.add(buttonpink); JButton buttonorange = new JButton(); buttonorange.setBackground(Color.orange); colorpane.add(buttonorange); //监听使用哪个图形 control.Control monitor = new control.Control(); //添加颜色监听器 // control.Control color = new control.Control(); buttonred.addActionListener(monitor); buttonblack.addActionListener(monitor); buttonblue.addActionListener(monitor); buttongreen.addActionListener(monitor); buttongray.addActionListener(monitor); buttonwhite.addActionListener(monitor); buttonyellow.addActionListener(monitor); buttonpink.addActionListener(monitor); buttonorange.addActionListener(monitor); buttoncircle.addActionListener(monitor); buttonline.addActionListener(monitor); buttonrectangle.addActionListener(monitor); buttontext.addActionListener(monitor); buttontriangle.addActionListener(monitor); panelBig.addMouseListener(monitor); panelBig.addMouseMotionListener(monitor); monitor.setG(panelBig.getGraphics()); monitor.getDrawX(); frame.setVisible(true); } public static void main(String[] args) { Gui pic = new Gui(); } } ```
初学韩顺平的坦克大战。面板上画不出 图形 显示空指针错误
/* * 画 出坦克 */ package gui; import javax.swing.*; import java.awt.*; public class MyTankGame01 extends JFrame { MyPanel mp = null; public static void main(String[] args) { // TODO Auto-generated method stub MyTankGame01 mtg = new MyTankGame01 () ; } //构造函数 public MyTankGame01(){ mp = new MyPanel(); this.add(mp); //this.setContentPane(mp); this.setSize(400, 300); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } // 我的面板 class MyPanel extends JPanel { //定义我的坦克 Hero hero= null ; public void MyPanel(){ hero = new Hero (10,10); } // 重新paint public void paint (Graphics g){ super.paint(g); g.fillRect(0,0,400,300); g.setColor(Color.yellow); //画出我的坦克(到时候封装成一个函数) // 1 :画出左面的举行 g.draw3DRect(hero.getX(),hero.getY(),5,30,false); } } //坦克类 class Tank { // 位置x 表示坦克的横坐标 纵坐标 int x = 0 ; int y = 0; public Tank (int x ,int y ){ this.x= x; this.y = y ; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } } //我的坦克 class Hero extends Tank{ public Hero (int x, int y ){ super(x,y ); } }
java关于JFrame中添加多个JPanel?
如果创建一个JPanel数组,但是每个JPanel都画了一个图形,但是添加到面板容器上,只显示容器最后一个图形,为什么其它都没有显示?
关于JSP页面内嵌(显示)JSP的问题
我有一个JSPa,该JSP是主要JSP页面。 还有一个JSPb,该JSP是用来绘制图形的,比如画一个圆。。。 我在JSPa中点击了绘图按钮,并且传递部分数据到servlet中去,通过servlet处理后 再传递到JSPb中,绘制出一个图形。 然而这个时候,我想将JSPb绘制的图形显示在JSPa中。 有一个原始的方法,就是将JSPb中的绘图代码全部放在JSPa中,检测过是可行的。 不过因为目前的绘图代码量过大,而且在JSPa页面上有很多的逻辑部分,各种请求很多一不留神就崩溃。想用一种简洁的方式。 PS:在不使用框架的情况下。 各位工程师有没有什么靠谱的方法,满足上面的需求。
java绘图时对多个图形(把这些图形视为一体)进行旋转操作
比如显示一个表,表上有刻度,让刻度进行 旋转(当然,实际中不会旋转,是指针进行旋转),现在我让课都进行旋转,怎么做, 我想到的时计算时将旋转角度进行变化,但是好像效率不高, 如果能将刻度视为一个整体,进行整体的旋转可以吗? 代码如下: ```java @Override public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; //去锯齿 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //清空原来的图形 g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, this.getWidth(), this.getHeight()); g2d.setColor(Color.BLACK); //圆中心坐标 int xCenter = this.getWidth() / 2; int yCenter = this.getHeight() / 2; // 计算半径 int radius = (int) (Math.min(this.getWidth(), this.getHeight()) * 0.8*0.5); //因为是半径,所以 1/2 // 画圆 g2d.drawOval(xCenter - radius, yCenter - radius, radius * 2, radius * 2); //画时钟的12个数字(如果用rotate方法则数字会倾斜倒立) for (int i = 0; i < 12; i++) { //已知圆中心占坐标(x0,y0),半径r,角度a0,则圆上任一点坐标(x,y)计算: //x = x0 + r * cos(ao * 3.14 /180) //y = y0 + r * sin(ao * 3.14 /180) double dd = Math.PI / 180 * i * (360 / 12); //每次转360/12度 int x = (xCenter - 4) + (int) ((radius - 12) * Math.cos(dd)); int y = (yCenter + 4) + (int) ((radius - 12) * Math.sin(dd)); //因为是从顺时钟3点钟开始画,所以索引i需要加上3 int j = i + 3; //这里可以改 if (j > 12) { j = j - 12; } g2d.drawString(Integer.toString(j), x, y); } AffineTransform old = g2d.getTransform(); //时钟的60个刻度 for (int i = 0; i < 60; i++) { int w = i % 5 == 0 ? 5 : 3; g2d.fillRect(xCenter - 2, 28, w, 3); g2d.rotate(Math.toRadians(6), xCenter, yCenter); //每一小格转6度, 以圆心为中心点 } //设置旋转重置 g2d.setTransform(old); Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); //画日期和星期 DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd"); //datadormat是一个抽象类 DateFormat df2 = new SimpleDateFormat("E"); //星期的格式 g2d.drawRoundRect(xCenter - 30, yCenter + 30, 72, 35, 10, 10); g2d.drawString(df1.format(calendar.getTime()), xCenter - 25, yCenter + 45); g2d.drawString(df2.format(calendar.getTime()), xCenter - 12, yCenter + 60); // 画时钟的图形 double hAngle = (hour - 12 + minute / 60d) * 360d / 12d; g2d.rotate(Math.toRadians(hAngle), xCenter, yCenter); int xhArr[] = {xCenter, xCenter + 9, xCenter, xCenter - 9}; int yhArr[] = {65, yCenter, yCenter + 10, yCenter}; g2d.drawPolygon(xhArr, yhArr, xhArr.length); g2d.setTransform(old); // 画分钟的图形 double mAngle = (minute + second / 60d) * 360d / 60d; g2d.rotate(Math.toRadians(mAngle), xCenter, yCenter); int xmArr[] = {xCenter, xCenter + 6, xCenter, xCenter - 6}; int ymArr[] = {45, yCenter, yCenter + 12, yCenter}; g2d.drawPolygon(xmArr, ymArr, xmArr.length); g2d.setTransform(old); // 画秒钟的图形 double sAngle = second * 360d / 60d; g2d.rotate(Math.toRadians(sAngle), xCenter, yCenter); g.drawLine(xCenter, yCenter + 10, xCenter, 35); } ``` 这个该怎么写?除了每次计算时进行 读书+旋转角度 ,这个方法除外 在此感谢
javafx 画的图怎么保存
用javafx画了一些简单的图形,请问要怎么保存,还有线条的轨迹怎么显示
java画图的相关问题
各位大虾~ 小弟要做一个小程序,是画一个流程图。通过输入一些参数,点击确定后显示图形。 我只知道画图用applet里的paint方法,但是要实现单击显示的事件如何写呢? 先行谢过各位了!
JVAV写贪吃蛇小游戏,用线程实现窗口重绘,然后用键盘指令改变小蛇的方向,请问怎么让小蛇只根据指令移动?
![图片说明](https://img-ask.csdn.net/upload/201906/05/1559710703_639058.png) 现在的程序能够实现通每隔200ms小蛇自动往前跑一格,通过键盘指令能够改变方向,但是我不想让它自动跑,只想实现给它指令它才移动,请问怎么实现? 这是蛇的活动类 ``` package com.tcs.cn; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Timer; /** * 这个类代表贪吃蛇的活动场所 * @author * @version */ public class Yard extends Frame { /* * 画图的线程 * */ Timer timer = new Timer(); PaintThread paintThread = new PaintThread(); private boolean gameOver = false; //游戏是否结束 /** * 行数 */ public static final int ROWS = 30; /* * 列数 * */ public static final int COLS = 30; /* * 活动区域大小 * */ public static final int BLOCK_SIZE = 15; //设置显示字属性 private Font fontGameOver = new Font("宋体", Font.BOLD, 50); //分数 private int score = 0; /* * 记录开始时候的时间 * */ private long beginTime=0; /* *实例化Snake和Egg的对象 * */ Snake s = new Snake(this); Egg e = new Egg(); /* * 抽象类 Image 是表示图形图像的所有类的超类。 * 必须以特定于平台的方式获取图像。 * */ Image offScreenImage = null; /* * 此函数的功能是:设置窗口的大小、位置、可见,以及点击事件和键盘事件,最后开启了绘图线程 * */ public void launch() { /* * 指定窗口的位置,窗口的左上角的位置为(90,10).是相对父窗口的相对位置 * */ this.setLocation(90, 10); /* * 设定窗口的大小 * 宽度width:COLS*BLOCK_SIZE * 高度hight:ROWS*BLOCK_SIZE * */ this.setSize(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); /* * 为窗口添加监听器 * */ this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); /* * 将窗口设置可见 * */ this.setVisible(true); /* * 为窗口添加键盘事件 * */ this.addKeyListener(new KeyMonitor()); new Thread(paintThread).start(); } public static void main(String[] args) { Yard y=new Yard(); y.beginTime=System.currentTimeMillis(); y.launch(); } /* * 将变量gameOver设置为true,使得在paint()函数中将使得线程停止 * */ public void stop() { gameOver = true; } @Override public void paint(Graphics g) { /* * 获取此图形上下文的颜色 * */ Color c = g.getColor(); /* * 指定图形上下文的颜色 * */ g.setColor(Color.GRAY); /* * 用当前的颜色来填充指定的区域 * */ g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); /* * 再一次的指定颜色为:黑灰色???????为什么要再一次的设定??? * 原因在于:我们想将绘图的颜色与文字显示的不一样 * */ g.setColor(Color.DARK_GRAY); //画出横线 /* * drawLine(int x1, int y1, int x2, int y2) * 函数的功能为: * 在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。 * 通过下面的两个for循环就会在图形化对象上画出表格 * */ for(int i=1; i<ROWS; i++) { g.drawLine(0, BLOCK_SIZE * i, COLS * BLOCK_SIZE, BLOCK_SIZE * i); } for(int i=1; i<COLS; i++) { g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS); } g.setColor(Color.YELLOW);//设定颜色,为下面显示文字信息做准备 /* * drawString(String str, int x, int y) *使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。 * */ g.drawString("使用说明:使用方向键控制方向,F1--停止,F2--停止后恢复,F5--重新开始" , 10, 40); g.drawString("目前分数:" + score, 10, 60); g.drawString("加分规则:每吃一个加5分,加油!" , 10, 80); g.drawString("已经使用的时间:"+(System.currentTimeMillis()-beginTime)/1000 , 10, 100); /* * 检测游戏是否结束,当游戏结束时,则提示游戏“game over”,而且将界面恢复到初始界面的状态,且终止绘图线程 * */ if(gameOver) { g.setFont(fontGameOver); g.drawString("game over!", 90, 170); g.drawString("在玩一次,请按F5", 10, 250); g.drawString(" ", 200, 230);//???这个用意何在?? paintThread.pause(); } if(score>100) { g.drawString("好棒!!!", 90, 170); g.drawString("你已经超过"+score+",继续加油", 10, 230); } /* * 将图形界面设置为刚开始的颜色 * */ g.setColor(c); s.eat(e); e.draw(g); s.draw(g); } @Override public void update(Graphics g) { if(offScreenImage == null) { /* * public Image createImage(int width, * int height) * 创建一幅用于双缓冲的、可在屏幕外绘制的图像 * */ offScreenImage = this.createImage(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); } /* * getGraphics() *创建供绘制闭屏图像(off-screen image)使用的图形上下文。 * */ Graphics gOff = offScreenImage.getGraphics(); paint(gOff); /* * drawImage(Image img, int x, int y, ImageObserver observer) * 绘制指定图像中当前可用的图像。 * */ g.drawImage(offScreenImage, 0, 0, null); } private class PaintThread implements Runnable { private boolean running = true; private boolean pause = false; public void run() { while(running) {//线程将一直处于运行当中,只有在游戏结束的时候 if(pause) continue; else repaint();//如果组件是轻量级组件,则会尽快调用paint()方法或者是调用update() try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } public void pause() { this.pause = true; } public void reStart() { this.pause = false; s = new Snake(Yard.this); gameOver = false; score=0; } public void gameOver() { running = false; } } /* * 此函数的功能为:检测我们是否按下F2,若按下,则重新启动线程,即重新开始游戏 * */ private class KeyMonitor extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if(key == KeyEvent.VK_F5) { paintThread.reStart();//重新开始游戏 } else if(key==KeyEvent.VK_F1){ paintThread.pause=true;//暂停 } else if(key==KeyEvent.VK_F2){ paintThread.pause=false;//从暂停中恢复 } s.keyPressed(e); } } /** * 拿到所得的分数 * @return 分数 */ public int getScore() { return score; } /** * 设置所得的分数 * @param score 分数 */ public void setScore(int score) { this.score = score; } } ``` 这是小蛇类 ``` package com.tcs.cn; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.KeyEvent; /** * 代表蛇 * @author * */ public class Snake { /* * 头结点 * */ private Node head = null; /* * 尾结点 * */ private Node tail = null; /* * 大小 * */ private int size = 0; /* * 开始游戏时: * 初始位置:(20,30) * 初始运动方向:Dir.L * */ private Node n = new Node(20, 30, Dir.L); /* * Yard的对象属性; * */ private Yard y; /* * 构造函数 * */ public Snake(Yard y) { /* * 将初始结点给头结点和尾结点,size初始化为 1, * */ head = n; tail = n; size = 1; this.y = y; } /* * 节点类 * */ private class Node { int w = Yard.BLOCK_SIZE; int h = Yard.BLOCK_SIZE; int row , col; Dir dir = Dir.L; Node next = null; Node prev = null; Node(int row, int col, Dir dir) { this.row = row; this.col = col; this.dir = dir; } void draw(Graphics g) { Color c = g.getColor(); g.setColor(Color.BLACK); g.fillRect(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, w, h); g.setColor(c); } } // 从尾加,代码与下面一个函数的代码功能相似,这里不再分析 public void addToTail() { Node node = null; switch(tail.dir) { case L : node = new Node(tail.row, tail.col + 1, tail.dir); break; case U : node = new Node(tail.row + 1, tail.col, tail.dir); break; case R : node = new Node(tail.row, tail.col - 1, tail.dir); break; case D : node = new Node(tail.row - 1, tail.col, tail.dir); break; } tail.next = node; node.prev = tail; tail = node; size ++; } // 从头加,下面的代码比较简单,相信大家应该都能理解 public void addToHead() { Node node = null; switch(head.dir) { case L : node = new Node(head.row, head.col - 1, head.dir); break; case U : node = new Node(head.row - 1, head.col, head.dir); break; case R : node = new Node(head.row, head.col + 1, head.dir); break; case D : node = new Node(head.row + 1, head.col, head.dir); break; } // node.next = head; // head.prev = node; // head = node; /* * 上面这种写法与下面这种写法一致,不过下面这种写法我更容易理解 * */ head.prev=node; node.next=head; head=node; size ++; } public void draw(Graphics g) { if(size <= 0) return; move(); for(Node n = head; n != null; n = n.next) { n.draw(g); } } /* * 移动过程所要做的操作:在运动方向增加一个节点,在尾部减去一个节点,并且检测是否已经死亡 * */ private void move() { addToHead(); deleteFromTail(); checkDead(); } private void checkDead() { if(head.row < 2 || head.col < 0 || head.row > Yard.ROWS || head.col > Yard.COLS) { y.stop(); } /* * 头节点与身体的某一个节点相撞,也标志着结束 * */ for(Node n = head.next; n != null; n = n.next) { if(head.row == n.row && head.col == n.col) { y.stop(); } } } /* * 删除尾节点 * */ private void deleteFromTail() { if(size == 0) return; tail = tail.prev; tail.next = null; } public void eat(Egg e) { /* * boolean intersects(Rectangle r) * 确定此 Rectangle 是否与指定的 Rectangle 相交。 * 若相交,表示我们吃到了一个点 ,则导致蛇的长度变长并且在出现一个点,并且加5分,否则什么也不做 * */ if(this.getRect().intersects(e.getRect())) { e.reAppear(); this.addToHead(); //吃了加5分 y.setScore(y.getScore() + 5); } } private Rectangle getRect() { /* * 构造了一个格子大小的区域 * */ return new Rectangle(Yard.BLOCK_SIZE * head.col, Yard.BLOCK_SIZE * head.row, head.w, head.h); } /* * 接收从键盘的按键事件,然后采取相应的解决方案 * */ public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_LEFT : /* * 当按键为左的时候,只要前进方向不是右,即可转向 * */ if(head.dir != Dir.R) head.dir = Dir.L; break; case KeyEvent.VK_UP : /* * 当按键为"上",只要前进方向不是"下",就可以转向 * */ if(head.dir != Dir.D) head.dir = Dir.U; break; case KeyEvent.VK_RIGHT : /* * 当按键为"右"的时候,只要前进方向不是"左",就可以转向 * */ if(head.dir != Dir.L) head.dir = Dir.R; break; case KeyEvent.VK_DOWN : /* * 当按键为"下"的时候,只要前进方向不是"上",就可以转向 * */ if(head.dir != Dir.U) head.dir = Dir.D; break; } } } ``` 求大神解答 hen'ji
基于JS渲染的图表如何自动在后台保存
基于javascript库的HTML统计图表,优点:丰富的第三方开源库,图形美观、种类齐全、灵活、编程简洁。 一般应用方式:前端HTML显示,需要打开浏览器加载、渲染。 画图和保存分离了,原来可能画图都是java做的,现在图是HTML画的,网页展示还保留。 但是增加一个后台(比如JAVA、Perl等)定时保存功能 example.html <html> <head> <script>......jquery./第三方js库......</script> <css>.............</css> <script> //渲染方式通常是 var mychart=chartObj.init("divid",'themestyle'); //保存图片方式也很简单, 初始化后的变量getDataURL("jpeg")可以获得BASE64编码的字符串 //将该字符串输出为图片即可,此处不赘述。 var myChartData=mychart.getDataURL("jpeg"); </script> </head> </html> 尝试的方案: 1.有人点击的图表,渲染完成后在js加一段代码,异步生成一张图。 不适合规模应用,耦合,影响网页正常的访问速度,而且更多的情况是该图表不会有人点,或点的时间不是需要保存的时刻。 2.java HtmlUnit 模拟浏览器终端行为 HtmlPage page = (HtmlPage) webClient.getPage(url); HtmlAnchor obj=(HtmlAnchor) page.getElementById("btnSaveImage"); obj.click(); 问题1:性能差。它每次会分析html所有引入js,失败率高 TypeError: Cannot find function click in object [object]. (http://127.0.0.1:8082/echarts/huanan/nos/adsl/asset/jquery.min.js#4) 问题2:似乎不能模拟网页完全渲染以后再调用某个js function org.mozilla.javascript.EcmaError: TypeError: Cannot call method "getDataURL" of undefined
注入资源依赖关系失败
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'paiMaiSerDaoImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.dlsp.service.PaiMaiSerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)} at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:306) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1122) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4842) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5303) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1407) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1397) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.dlsp.service.PaiMaiSerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:986) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:438) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:550) at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303) ... 22 more 二月 24, 2017 11:03:25 上午 org.apache.catalina.core.StandardContext startInternal 严重: One or more listeners failed to start. Full details will be found in the appropriate container log file 二月 24, 2017 11:03:25 上午 org.apache.catalina.core.StandardContext startInternal 严重: Context [/ZuoYeXiangMu_3] startup failed due to previous errors 二月 24, 2017 11:03:25 上午 org.apache.catalina.core.ApplicationContext log 信息: Closing Spring root WebApplicationContext 二月 24, 2017 11:03:25 上午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesJdbc 警告: The web application [ZuoYeXiangMu_3] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 二月 24, 2017 11:03:25 上午 org.apache.catalina.loader.WebappClassLoaderBase checkThreadLocalMapForLeaks 严重: The web application [ZuoYeXiangMu_3] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@41376b06]) and a value of type [java.lang.Class] (value [class oracle.sql.AnyDataFactory]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. 二月 24, 2017 11:03:25 上午 org.apache.catalina.loader.WebappClassLoaderBase checkThreadLocalMapForLeaks 严重: The web application [ZuoYeXiangMu_3] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@7b5d1ae6]) and a value of type [java.lang.Class] (value [class oracle.sql.TypeDescriptorFactory]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. 二月 24, 2017 11:03:25 上午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["http-nio-8080"] 二月 24, 2017 11:03:25 上午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["ajp-nio-8009"] 二月 24, 2017 11:03:25 上午 org.apache.catalina.startup.Catalina start 信息: Server startup in 4212 ms package com.dlsp.controller; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.Random; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.jsp.PageContext; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.dlsp.dao.UserLoginDao; import com.dlsp.domain.Manage; import com.dlsp.domain.Saleinfo; import com.dlsp.service.PaiMaiSerDao; import com.dlsp.service.UserLoginSerDao; import com.dlsp.service.impl.PaiMaiSerDaoImpl; import com.sun.java.swing.plaf.motif.resources.motif; import com.sun.org.apache.regexp.internal.recompile; @Controller public class PaiMaicontroler { @Resource private PaiMaiSerDao paimai; //获得随机颜色 Color getRandColor(int fc, int bc){ Random random = new Random(); if (fc > 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } //验证码 @RequestMapping("yanzheng.action") public void yanzhengn(HttpServletRequest request,HttpServletResponse response,HttpSession session){ //设置页面不缓存 session=request.getSession(); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 在内存中创建图象 int width = 60, height = 20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); //生成随机类 Random random = new Random(); // 设定背景色 g.setColor(getRandColor(200, 250)); g.fillRect(0, 0, width, height); //设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); //画边框 //g.setColor(new Color()); //g.drawRect(0,0,width-1,height-1); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(getRandColor(160, 200)); for (int i = 0; i < 155; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); g.drawLine(x, y, x + xl, y + yl); } // 取随机产生的认证码(4位数字) String sRand = ""; for (int i = 0; i < 4; i++) { String rand = String.valueOf(random.nextInt(10)); sRand += rand; // 将认证码显示到图象中 g.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.drawString(rand, 13 * i + 6, 16); } // 将认证码存入SESSION session.setAttribute("numrand", sRand); // 图象生效 g.dispose(); // 输出图象到页面 try { ImageIO.write(image, "JPEG", response.getOutputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //out.clear(); //out = PageContext.pushBody(); } @RequestMapping("saleinfo.action") public String getsuoyou(Model mo) { List<Saleinfo> jihe = paimai.getall(); mo.addAttribute("jihe", jihe); return "saleinfo"; } @RequestMapping("addinfo.action") public String addinfo(Saleinfo sale, Model mo) { if (paimai.insertsale(sale) > 0) { mo.addAttribute("cheng", 1); } else { mo.addAttribute("cheng", 2); } return "redirect:saleinfo.action"; } @RequestMapping("update.action") public String updateinfo(Saleinfo sale,Model mo){ if (paimai.updatedale(sale)>0) { mo.addAttribute("gai", 1); }else{ mo.addAttribute("gai", 2); } return "redirect:saleinfo.action"; } @RequestMapping("sahn.action") public String deleteinfo(int id,Model mo){ if (paimai.deletesale(id)>0) { mo.addAttribute("shan", 1); }else{ mo.addAttribute("shan", 2); } return "redirect:saleinfo.action"; } } package com.dlsp.controller; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.Random; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.jsp.PageContext; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.dlsp.dao.UserLoginDao; import com.dlsp.domain.Manage; import com.dlsp.domain.Saleinfo; import com.dlsp.service.PaiMaiSerDao; import com.dlsp.service.UserLoginSerDao; import com.dlsp.service.impl.PaiMaiSerDaoImpl; import com.sun.java.swing.plaf.motif.resources.motif; import com.sun.org.apache.regexp.internal.recompile; @Controller public class PaiMaicontroler { @Resource private PaiMaiSerDao paimai; //获得随机颜色 Color getRandColor(int fc, int bc){ Random random = new Random(); if (fc > 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } //验证码 @RequestMapping("yanzheng.action") public void yanzhengn(HttpServletRequest request,HttpServletResponse response,HttpSession session){ //设置页面不缓存 session=request.getSession(); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 在内存中创建图象 int width = 60, height = 20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); //生成随机类 Random random = new Random(); // 设定背景色 g.setColor(getRandColor(200, 250)); g.fillRect(0, 0, width, height); //设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); //画边框 //g.setColor(new Color()); //g.drawRect(0,0,width-1,height-1); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(getRandColor(160, 200)); for (int i = 0; i < 155; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); g.drawLine(x, y, x + xl, y + yl); } // 取随机产生的认证码(4位数字) String sRand = ""; for (int i = 0; i < 4; i++) { String rand = String.valueOf(random.nextInt(10)); sRand += rand; // 将认证码显示到图象中 g.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.drawString(rand, 13 * i + 6, 16); } // 将认证码存入SESSION session.setAttribute("numrand", sRand); // 图象生效 g.dispose(); // 输出图象到页面 try { ImageIO.write(image, "JPEG", response.getOutputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //out.clear(); //out = PageContext.pushBody(); } @RequestMapping("saleinfo.action") public String getsuoyou(Model mo) { List<Saleinfo> jihe = paimai.getall(); mo.addAttribute("jihe", jihe); return "saleinfo"; } @RequestMapping("addinfo.action") public String addinfo(Saleinfo sale, Model mo) { if (paimai.insertsale(sale) > 0) { mo.addAttribute("cheng", 1); } else { mo.addAttribute("cheng", 2); } return "redirect:saleinfo.action"; } @RequestMapping("update.action") public String updateinfo(Saleinfo sale,Model mo){ if (paimai.updatedale(sale)>0) { mo.addAttribute("gai", 1); }else{ mo.addAttribute("gai", 2); } return "redirect:saleinfo.action"; } @RequestMapping("sahn.action") public String deleteinfo(int id,Model mo){ if (paimai.deletesale(id)>0) { mo.addAttribute("shan", 1); }else{ mo.addAttribute("shan", 2); } return "redirect:saleinfo.action"; } } package com.dlsp.controller; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.Random; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.jsp.PageContext; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.dlsp.dao.UserLoginDao; import com.dlsp.domain.Manage; import com.dlsp.domain.Saleinfo; import com.dlsp.service.PaiMaiSerDao; import com.dlsp.service.UserLoginSerDao; import com.dlsp.service.impl.PaiMaiSerDaoImpl; import com.dlsp.service.impl.UserLoginService; import com.sun.java.swing.plaf.motif.resources.motif; import com.sun.org.apache.regexp.internal.recompile; @Controller public class UserLogincontroler { @Resource private UserLoginSerDao login; @RequestMapping("admin.action") public String asdsa(){ return "admin"; } //普通登陆判断 @RequestMapping("dengdeng.action") public String denglu(Manage ma,Model mo,String checkbox){ ma=login.loginman(ma); if (!ma.equals("")) { if (ma.getAdmin()==1) { mo.addAttribute("user", ma); if (!checkbox.equals("")) { Cookie co=new Cookie("username", ma.getManame()); } return "saleinfo"; } return "admin"; } return "admin"; } //转换管理员登陆界面 @RequestMapping("denglu.action") public String denglupan(Model mo){ mo.addAttribute("admin", "123123"); return "admin"; } //转换普通用户登陆界面 @RequestMapping("dengluq.action") public String denglupantwo(Model mo){ mo.addAttribute("admin", null); return "admin"; } } package com.dlsp.controller; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.Random; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.jsp.PageContext; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.dlsp.dao.UserLoginDao; import com.dlsp.domain.Manage; import com.dlsp.domain.Saleinfo; import com.dlsp.service.PaiMaiSerDao; import com.dlsp.service.UserLoginSerDao; import com.dlsp.service.impl.PaiMaiSerDaoImpl; import com.dlsp.service.impl.UserLoginService; import com.sun.java.swing.plaf.motif.resources.motif; import com.sun.org.apache.regexp.internal.recompile; @Controller public class UserLogincontroler { @Resource private UserLoginSerDao login; @RequestMapping("admin.action") public String asdsa(){ return "admin"; } //普通登陆判断 @RequestMapping("dengdeng.action") public String denglu(Manage ma,Model mo,String checkbox){ ma=login.loginman(ma); if (!ma.equals("")) { if (ma.getAdmin()==1) { mo.addAttribute("user", ma); if (!checkbox.equals("")) { Cookie co=new Cookie("username", ma.getManame()); } return "saleinfo"; } return "admin"; } return "admin"; } //转换管理员登陆界面 @RequestMapping("denglu.action") public String denglupan(Model mo){ mo.addAttribute("admin", "123123"); return "admin"; } //转换普通用户登陆界面 @RequestMapping("dengluq.action") public String denglupantwo(Model mo){ mo.addAttribute("admin", null); return "admin"; } } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dlsp.dao.PaiMaiDao"> <sql id="sale"> said,saname,startmoney,endmondey,starttime,endtime,panduan,remark </sql> <sql id="man"> id,maname,password,cardnum,tell, dizhi,youzheng,admin </sql> <!-- 基本的用户信息 --> <resultMap id="paimaiMP" type="com.dlsp.domain.Saleinfo"> <id property="said" column="said" /> <result property="saname" column="saname" /> <result property="startmoney" column="startmoney" /> <result property="endmondey" column="endmondey" /> <result property="starttime" column="starttime" /> <result property="endtime" column="endtime" /> <result property="panduan" column="panduan" /> <result property="remark" column="remark" /> </resultMap> <resultMap type="com.dlsp.domain.Manage" id="manageMP"> <id property="id" column="id" /> <result property="maname" column="maname" /> <result property="password" column="password" /> <result property="cardnum" column="cardnum" /> <result property="tell" column="tell" /> <result property="dizhi" column="dizhi" /> <result property="youzheng" column="youzheng" /> <result property="admin" column="admin" /> </resultMap> <select id="getall" resultMap="paimaiMP" > select <include refid="sale"/> from saleinfo </select> <select id="loginman" resultMap="manageMP"> select <include refid="man"/> from manage </select> </mapper> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dlsp.dao.UserLoginDao"> <sql id="man"> id,maname,password,cardnum,tell, dizhi,youzheng,admin </sql> <resultMap type="com.dlsp.domain.Manage" id="manageMP"> <id property="id" column="id" /> <result property="maname" column="maname" /> <result property="password" column="password" /> <result property="cardnum" column="cardnum" /> <result property="tell" column="tell" /> <result property="dizhi" column="dizhi" /> <result property="youzheng" column="youzheng" /> <result property="admin" column="admin" /> </resultMap> <select id="loginman" parameterType="com.dlsp.domain.Manage" resultType="com.dlsp.domain.Manage"> select <include refid="man"/> from manage where maname=#{maname} and password=#{password} </select> </mapper> package com.dlsp.service; import java.util.List; import com.dlsp.domain.Manage; import com.dlsp.domain.Saleinfo; public interface PaiMaiSerDao { //查 List<Saleinfo> getall(); //增 int insertsale(Saleinfo sale); //删 int deletesale(int id); //改 int updatedale(Saleinfo sale); } package com.dlsp.service; import com.dlsp.domain.Manage; public interface UserLoginSerDao { //登陆 Manage loginman(Manage manage); } package com.dlsp.service.impl; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.dlsp.dao.PaiMaiDao; import com.dlsp.domain.Manage; import com.dlsp.domain.Saleinfo; import com.dlsp.service.PaiMaiSerDao; @Service public class PaiMaiSerDaoImpl implements PaiMaiSerDao {// 设置依赖的类 @Resource private PaiMaiSerDao dao; @Override public List<Saleinfo> getall() { return dao.getall(); } @Override public int insertsale(Saleinfo sale) { return dao.insertsale(sale); } @Override public int deletesale(int id) { return dao.deletesale(id); } @Override public int updatedale(Saleinfo sale) { return dao.updatedale(sale); } } package com.dlsp.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.dlsp.dao.PaiMaiDao; import com.dlsp.dao.UserLoginDao; import com.dlsp.domain.Manage; import com.dlsp.service.UserLoginSerDao; @Service public class UserLoginService implements UserLoginSerDao { @Resource private UserLoginSerDao dao; @Override public Manage loginman(Manage manage) { return dao.loginman(manage); } } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" > <!-- 1.包扫描 service dao (注解方式) --> <context:component-scan base-package="com.dlsp.dao,com.dlsp.service"/> <!-- 2. jdbc.properties 属性配置文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 3.数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverclass}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 4.sqlsessionfactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 怎么和mybatis整合,关联Mybatis,关联映射文件 --> <property name="configLocation" value="classpath:sqlMapConfig.xml"/> <property name="mapperLocations" value="classpath:com/dlsp/dao/*.xml"/> </bean> <!-- 5.事务 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="find*" read-only="true"/> <tx:method name="get*" read-only="true"/> <tx:method name="list*" read-only="true"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut expression="execution(* com.dlsp.service.*.*(..))" id="txPointCut"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> </aop:config> </beans>
贪吃蛇 窗体布局问题
首先,我和视频教程的代码一模一样。就是不能修改panel的颜色 ``` public class Snake { 7 8 public static void main(String[] args) { 9 10 JFrame frame = new JFrame(); // 创建一个游戏界面的框架 11 frame.setBounds(10, 10, 900, 720); // 设置框架的大小 12 frame.setResizable(false); // 设置框架大小为不能改变 13 // 点击关闭按钮 关闭游戏界面 14 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 15 16 SnakePanel panel = new SnakePanel(); //添加画布 17 frame.add(panel); // 刚添加时画布是空的看不到 18 19 frame.setVisible(true); // 允许显示游戏界面 20 } 21 22 } ``` ``` package snake; import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; public class SnakePanel extends JPanel {//继承 JPanel 这个类实则是画布(内容白板) 把这个画布添加到主方法 public SnakePanel(){ // 这个画布需要两个方法 一个是初始化方法 获得焦点 this.setFocusable(true); } public void paint(Graphics g){ // 图形 可以理解为 一支笔 随便把它的包导进来 this.setBackground(Color.PINK); // this 指代SnakePanel 设置这个画布或者白板的颜色 } } ``` 运行后无法修改 画布 jpanel的颜色。这个问题不止我一个人遇到,我百度了很多人,仍然没有答案。 有人说是paint()的方法问题。 源代码作者解释: class SnakePanel 本质就是JPanel 其中this 就是SnakePanel。 显示,我把this换成SnakePanel是出现错误。但是源代码作者运行却没有问题、 http://www.qingke.me/lessons/96/show_video 源代码作者
JAVA小白求救:坦克大战-多关卡咋做?没思路。。。
坦克大战-多关卡咋做: 自己代码如下: //坦克大战:-换关卡,-IO声音流,把爆炸换成外面的图片,有BUG继续游戏的时候看不到爆炸一下才能看到地方坦克, import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; import java.io.*; public class Tank1 extends JFrame implements ActionListener{ MyPanel mp=null; StartPanel gkmp=null; //Record record=null; JMenuBar cd=null;//??不熟 JMenu cd1=null;//??不熟 JMenu cd2=null; JMenuItem cd1xl1=null;//菜单栏1系列的1 JMenuItem cd1xl2=null;//菜单栏1系列的2 JMenuItem cd1xl3=null;//菜单栏1系列的1 JMenuItem cd1xl4=null;//菜单栏1系列的2 JMenuItem cd2xl1=null;//菜单栏2系列的1 JLabel imageJLabel=null; String newGame="newGame";//? //Image tp1=null; public static void main(String[] args) { Tank1 t1=new Tank1(); } public Tank1(){ gkmp=new StartPanel(); mp=new MyPanel(newGame);//?? Record record=new Record();//创建一个记录对象 Thread t=new Thread(gkmp); t.start(); cd=new JMenuBar();//菜单栏 不熟 cd1=new JMenu("游戏(G)");//第一个菜单栏的第一个菜单 cd1.setMnemonic('G');//快界键 cd2=new JMenu("设置(Z)"); cd2.setMnemonic('Z'); cd1xl1=new JMenuItem("开始新游戏(N)");//菜单系列 cdxl cd1xl1.setMnemonic('N'); cd1xl1.addActionListener(this);//加组件监听 cd1xl1.setActionCommand("newGame");//设置键值,和上文同名参数有啥关系没? cd1.add(cd1xl1); cd1xl2=new JMenuItem("继续游戏(H)");//菜单系列 cdxl cd1xl2.setMnemonic('H'); cd1xl2.addActionListener(this);//加组件监听 cd1xl2.setActionCommand("goonGame");//设置键值 cd1.add(cd1xl2); cd1xl3=new JMenuItem("保存退出(S)");//菜单系列 cdxl cd1xl3.setMnemonic('S'); cd1xl3.addActionListener(this);//加组件监听 cd1xl3.setActionCommand("saveOut");//设置键值 cd1.add(cd1xl3); cd1xl4=new JMenuItem("退出(Q)"); cd1xl4.setMnemonic('Q'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("exit");//设置键值 cd1.add(cd1xl4); cd.add(cd1);//给菜单栏 cd 添加菜单 cd1 cd2xl1=new JMenuItem("速度(F)");//菜单系列 cdxl 没做好效果? cd1xl4.setMnemonic('F'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("FSpeed");//设置键值 cd2.add(cd2xl1); cd.add(cd2); ImageIcon img = new ImageIcon("E:/Tank1/tankebig.PNG"); JLabel imageJLabel = new JLabel(img); gkmp.add(imageJLabel); this.add(gkmp); this.setJMenuBar(cd); this.setTitle("坦克大战"); ImageIcon tp1=new ImageIcon("E:/Tank1/tankexiao.PNG");//设置小图标地址要写全路径 this.setIconImage(tp1.getImage()); this.setSize(700,620); this.setLocation(300,80); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//可见 this.setResizable(false);//可调 // this.setResizable(true); } public void actionPerformed(ActionEvent e){ //boolean flag=true; if(e.getActionCommand().equals("newGame")) { this.remove(gkmp);//取消界面 gkmp if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("newGame"); } this.add(mp); this.addKeyListener(mp); Thread t=new Thread(mp);//启动我的MyPanel模板对象mp的线程 t.start();//叫醒线程 this.setVisible(true);//因为默认的是不可见,必须写这个!! Record.bcjl();//???? }else if(e.getActionCommand().equals("saveOut")) { Record record0=new Record(); // record0.setDtk(mp.dtk); record0.cunpan();///?????? System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("exit")) { Record.bcjl(); System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("goonGame")){ this.remove(gkmp); if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("goonGame"); } Thread t=new Thread(mp); t.start(); this.add(mp); this.addKeyListener(mp); this.setVisible(true); } } class StartPanel extends JPanel implements Runnable //开始界面类 { int time=0; public void paint(Graphics g){ super.paint(g); // g.fillRect(0, 0, 600, 500);//设置画布 g.setColor(Color.black);//设置颜色 Color mycolor1=new Color(250,50,0);//自定义红色 g.setFont(new Font("华文琥珀",Font.BOLD,80));//设置字体//? g.drawString("坦克大战",190 , 460);//绘字符串 g.setColor(Color.black);//设置颜色 g.setFont(new Font("黑体",1,14));//设置字体 g.drawString("李晋祥",648 , 552);//绘字符串 if(time%2==0) { g.setColor(Color.white);//设置颜色 g.setFont(new Font("华文行楷",3,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("准备战斗",270 , 345);//绘字符串 } } StartPanel(){ } public void run(){ while(true){ try{ Thread.sleep(400); }catch(Exception e){} time++; this.repaint(); } } } class MyPanel extends JPanel implements KeyListener,Runnable { //Vector<MyTank> mts=new Vector<MyTank>();//建立一个我的坦克集合类可以出无限个坦克 MyTank mt=null; MyTank mt0=null; MyTank mt01=null; MyTank mt02=null; Vector<DiTank> dtk=new Vector<DiTank>();//建立一个敌坦克集合类 Props props=null; Vector<Baozha> bzjh=new Vector<Baozha>();//创建一个爆炸类的集合 Vector<Weizhi> wzjh=new Vector<Weizhi>();//建立一个位置集合类,为啥建立这集合类 int tksl=3;//坦克数量 int a=122; int b=455; int n=10; int myzdNum=4;//? int propsSort=5; int time=0; boolean flag=true;//标记是不是已经创建过MyPanel类 boolean b1=false; int x=1;//总关卡数? int rocket=1;//没用? int huopao=0;//? Color mycolor1=new Color(250,50,0);//自定义红色 Color mycolor2=new Color(0,250,50);//自定义绿色 Color mycolor3=new Color(0,50,250);//自定义兰色 Color mycolor11=new Color(130,200,0);//自定义土黄 Color mycolor31=new Color(0,100,200);//自定义兰色 Color mycolor21=new Color(0,250,0);//自定义绿色 JLabel imageJLabel0=null; JLabel imageJLabel1=null; ImageIcon img0=null;//? ImageIcon img1=null;//? public MyPanel(String ss) { ImageIcon img0 = new ImageIcon("e:/Tank1/background.jpg"); JLabel imageJLabel0 = new JLabel(img0); this.add(imageJLabel0); Record.dqjl();//? mt=new MyTank(600,280);//new多个可改为多个坦克,循环数组 mt0=new MyTank(550,280);//new多个可改为多个坦克,循环数组 mt01=new MyTank(550,330);//new多个可改为多个坦克,循环数组 mt02=new MyTank(600,330);//new多个可改为多个坦克,循环数组 props=new Props(30,30);//没有实际意义,为了new对象,必须要有个参数? if(ss.equals("newGame")){ // record=new Record(); for(int i=0;i<tksl;i++){ DiTank dt=new DiTank((i)*a,b);//添加出场敌坦 // dt.dtkxl(dtk);///???是不是敌人坦克血量 dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } }else if(ss.equals("goongame")){//继续游戏有问题 感觉读取存盘信息有问题 wzjh=Record.dupan(); for(int i=0;i<wzjh.size();i++){ Weizhi wz=wzjh.get(i); DiTank dt=new DiTank(wz.x,wz.y);//添加出场敌坦 dt.setFangxiang(wz.fangxiang); // dt.dtkxl(dtk);//?敌坦克血量,好像暂时用不着 // dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } } flag=false;//MyPanel类的mp创建过一次就标记为假 // this.repaint(); // Record.next(); // if(Record.next()%2!=0){ // Record.reMtNum();//需要吗? // Record.reDtNum();//需要吗? // Record.reAddMtNum(); // } } public void outNum(Graphics g)//画出统计数据的方法也即使显示数量的函数 { g.setColor(Color.cyan); this.drawTank(500,150,g,0,0);//引用drawtank()的不能是g,而是this this.drawTank(570,150,g,0,1); this.drawTank(500,70,g,0,1); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20));//??换换字体效果 g.drawString(Record.getDtNum()+"",600,170); if((Record.getMtNum()+Record.getAddMtNum())>=0){ g.drawString((Record.getMtNum()+Record.getAddMtNum())+"",530,170);// }else{ g.drawString((Record.getAddMtNum())+"",530,170); } g.setColor(Color.blue); g.setFont(new Font("方正小标宋",1,17)); g.drawString("干掉的坦克总数:",510,40); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20)); g.drawString(Record.getSumDtNum()+"",530,90); g.setColor(Color.MAGENTA);//设置颜色 g.setFont(new Font("隶书",0,20));//设置字体 g.drawString("第"+x+"关",500 , 200);//绘字符串 } public void paint(Graphics g){//这个方法每当窗口激活,最小化,调用repaint()方法都会运行,线程中调用就一直显示 super.paint(g); // g.fillRect(0,0,400,300);//做个背景画布,默认黑色 this.outNum(g);//调用显示数量的函数 g.setColor(Color.red);//设置颜色 g.fillRect(530, 210, 30, 20); g.setColor(Color.black);//设置颜色 g.drawLine(530, 210, 530, 320); g.setColor(mycolor11);//设置颜色 if(mt.live==true){ this.drawTank(mt.getX(),mt.getY(),g,mt.fangxiang,0); } if(mt0.live==true){ this.drawTank(mt0.getX(),mt0.getY(),g,mt0.fangxiang,2); } if(mt01.live==true){ this.drawTank(mt01.getX(),mt01.getY(),g,mt01.fangxiang,2); } if(mt02.live==true){ this.drawTank(mt02.getX(),mt02.getY(),g,mt02.fangxiang,2); } if(mt.getLive()==false){ g.setColor(mycolor11);//设置颜色 g.setFont(new Font("Gill Sans Ultra Bold Condensed",1,40));//字体:华康楷体, Ravie, OCR A Extended g.drawString("game over...",200 , 220);//绘字符串 this.repaint(); } if(Record.getDtNum()%6==0&&(Record.getDtNum()>10)){ // if(time%2==0) // { g.setColor(Color.blue);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("你行不行?",310 , 265);//绘字符串 // } } if(Record.getDtNum()==0){ g.setColor(Color.red);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("过关!",300 , 265);//绘字符串 } for(int i=0;i<dtk.size();i++)//画敌人坦克asd { DiTank dt=dtk.get(i); if(dt.live==true){ this.drawTank(dt.getX(),dt.getY(),g,dt.fangxiang,1);//??!!注意用法用dtk 还是dt调用 } } for(int i=0;i<mt.aa.size();i++)//画我的子弹 { Zidan zd=mt.aa.get(i); if(mt.zd!=null&&mt.zd.live==true) //???画子弹的条件 { //g.fill3DRect((mt.zd.x-2),(mt.zd.y-2), 8, 8, false); //???画子弹火力圈 g.setColor(Color.black);//子弹颜色设置为白色 g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false) { mt.aa.remove(zd); } } //this.repaint();//? for(int i=0;i<dtk.size();i++)//画敌人的子弹 { DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++) { Zidan zd=dt.dzd.get(j); if(zd!=null&&dtk.get(i).live==true) { g.setColor(Color.red);//子弹颜色设置为红色,次处不进循环是不是更好? g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false)//删除生命为假的敌人子弹???? { dt.dzd.remove(zd); } } } for(int i=0;i<bzjh.size();i++) //画爆炸 { Baozha bz=bzjh.get(i); if(bzjh.get(i).livetime>140){ g.setColor(Color.red); g.fillOval(bz.x, bz.y+5, 20,20 );//代替上面的句子 //g.fillOval(bz.x, bz.y, 20,5 );//可以用来做合成图形,但是要定好坐标点 }else if((bzjh.get(i).livetime<=100)&&(bzjh.get(i).livetime>50)){ g.setColor(Color.orange); g.fillOval(bz.x+4, bz.y+9, 12,12 ); }else if((bzjh.get(i).livetime<=50)&&(bzjh.get(i).livetime>20)){ g.setColor(Color.yellow); g.fillOval(bz.x+7, bz.y+11,5,5 ); }else{ g.setColor(Color.pink); g.fillOval(bz.x+10, bz.y+13,2,2 ); } bz.ltjs(); //生存时间减少函数 if(bz.livetime==0){ bzjh.remove(bz); } } // if(props.live==true){//画道具 this.drawProps(props.getX(),props.getY(),g,props.getleixing()); } //} this.repaint();//教学视频少了这句,子弹无法自主运行,主类启动线程后仍然可动 } public void keyPressed(KeyEvent e)//键盘输入事件 { if(mt.getLive()==true){ if(e.getKeyCode()==KeyEvent.VK_W){ this.mt.setFangxiang(0); this.mt.xiangshang(); }else if(e.getKeyCode()==KeyEvent.VK_S){ this.mt.setFangxiang(1); this.mt.xiangxia(); }else if(e.getKeyCode()==KeyEvent.VK_A){ this.mt.setFangxiang(2); this.mt.xiangzuo(); }else if(e.getKeyCode()==KeyEvent.VK_D){ this.mt.setFangxiang(3); this.mt.xiangyou(); } if(e.getKeyCode()==KeyEvent.VK_J) { if((mt.aa.size()<myzdNum)&&(mt.live==true))//子弹设置最多 myzdNum 发 { this.mt.fszd();//调用发射子弹函数 } } } } public void crash(){ } public boolean addprops(Props props,MyTank mt)//吃道具触发 方法 (道具功能触发模型为边长20的正方形) { boolean b2=false; switch(props.leixing){ case 0://我的坦克速度提高//mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.sudu=20; b2=true; } break; case 1://效果回到出生地 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.setX(630); mt.setY(280); b2=true; } break; case 2://提高我可以发射的子弹数目 //mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; this.myzdNum=30; this.huopao=1; this.n=4; b2=true; } break; case 3://显示的敌人坦克全死,但实际效果是..是不出敌方坦克了!!!! if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; for(int i=0;i<dtk.size();i++){ if(dtk.get(i).live==true){ dtk.get(i).live=false; Record.setDtNum();//有几个活坦克生命变假,就累计几辆dtNum } } b1=true; b2=true; } break; case 4://吃道具加命 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; Record.setAddMtNum(); b2=true; // System.out.println("吃道具加命程序,正常运行"); } break; } return b2; } // addMyTank++; //MyTank mt1=new MyTank(mt.getX(),mt.getY());//??创建另一个MyTank对象 // public void setAddMytank(){ // addMyTank++; // }; // public static int getAddMytank(){ // return addMyTank; // }; public void run() //我的画板的 线程函数 { while(true){ try{ Thread.sleep(50);// }catch(Exception e){} for(int i=0;i<mt.aa.size();i++)//我的子弹集中敌坦克的线程 { Zidan myzd=mt.aa.get(i); if(myzd.live){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j); // Zidan zd=dt.dzd.get(j);//为啥dzd可以直接用,不用创建// ||(b1==true&&Record.getDtNum()>0) if(dt.live)//内关联敌人坦克重生的一种情况,有敌人坦克被打中 { if(this.jzsf(myzd,dt)&&((Record.getDtNum()-tksl)>=0)){//调用jzsf(),打中同时,坦克定点?及时重生 DiTank dt0=new DiTank((int)(Math.random()*50+5)*10,(int)(Math.random()*100+450)); Thread t2=new Thread(dt0); t2.start(); Zidan zd0=new Zidan(dt0.x,dt0.y,dt0.fangxiang); Thread t3=new Thread(zd0); t3.start(); dt0.dzd.add(zd0); dtk.add(dt0); } } } } } if(Record.getDtNum()>=tksl&&b1==true){ //炸弹爆炸,敌坦克按条件重生, for(int i=0;i<tksl;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-1))&&(b1==true)){ for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-2))&&(b1==true)){ // for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); b1=false; } for(int j=0;j<dtk.size();j++)//敌人的子弹击中我的坦克的线程 { DiTank dt=dtk.get(j);//取出所有敌方坦克 for(int i=0;i<dt.dzd.size();i++) { Zidan zd=dt.dzd.get(i);//? if(zd.live) { if(this.jzsf(zd,mt)==true){//调用 击中敌坦 函数 } } } } if((this.time%120)==0){//6秒发生1次 道具随机重置//draw mt hit props props.live=true; // props.leixing=2; props.leixing=(int)(Math.random()*propsSort); props.x=(int)(Math.random()*370); props.y=(int)(Math.random()*270); props.livetime=100;//道具生存期 } if(props.livetime>0){//道具生存期变化 props.livetime--; }else{ props.live=false; } if(mt.live==true&&props.live==true){//调用 吃道具 方法 this.addprops(props,mt); } time++; // if(SaveData.getSumDtNum()%20==0){ // Record.next(); // } this.repaint();//线程运行中重绘?? } } public void jzwf()//敌人子弹集中我方坦克的方法 { for(int i=0;i<this.dtk.size();i++){ DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++){ Zidan zd=dt.dzd.get(j); this.jzsf(zd, mt); } } } public void jzdf() //我的子弹击中坦克的方法 { for(int i=0;i<mt.aa.size();i++){ Zidan zd=mt.aa.get(i);//从我的子弹集合类取我的各个子弹 if(zd.live==true){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j);//从敌坦克集合类取出各个敌坦克 if(dt.live){ this.jzsf(zd,dt); // levelDtNum--; } } } this.repaint(); } } public boolean jzsf(Zidan zd,Tank tk)//击中双方的方法 { boolean b2=false; switch(tk.fangxiang) { case 0: case 1: if(zd.x>tk.x&&zd.x<tk.x+20&&zd.y>tk.y&&zd.y<tk.y+30)//分辨率判断? { if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum(); Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(140); mt.setY(232); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; case 2: case 3: if(zd.x>tk.x&&zd.x<tk.x+30&&zd.y>tk.y&&zd.y<tk.y+20){ if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum();//每次敌人坦克数量-1 Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(550); mt.setY(270); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; } return b2; } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing)//画坦克函数 { int m=10; //double n=1; switch(leixing)//不同阵营坦克 { case 0://我的坦克 g.setColor(Color.yellow);// 我的坦克颜色 黄色 // g.fillOval(170*huopao, 240*huopao, 30*huopao, 30*huopao); m=11; break; case 1://敌人的坦克 g.setColor(mycolor3);//敌人坦克颜色 蓝色 // m=15; break; case 2://玩家2的坦克 g.setColor(mycolor1);//敌人坦克颜色 绿色 break; } switch(fangxiang)//不同方向的坦克(0,1,2,3)分别代表上下左右,中心原点不变做坐标变换 { case 0://上 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y-5,x+10,(y+10)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 1://下 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y+10,x+10,(y+35)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 2://左 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x-10)+n-m,y+15,(x+10),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 3://右 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x+10)-n+m,y+15,(x+30),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; } } public void drawProps(int x,int y,Graphics g,int leixing)//画道具 { if(time%8==0){ switch(leixing) { case 0://画车轮对应坦克加速 g.setColor(Color.white); g.fillOval(x, y, 21, 21); g.setColor(Color.black); g.fillOval(x+2,y+2,16,16); g.setColor(Color.white); g.drawOval(x+2,y+2,16,16); g.drawLine(x+2,y+10,x+18,y+10); g.drawLine(x+10,y+2,x+10,y+18); g.drawLine(x+16,y+4,x+4,y+16); g.drawLine(x+4,y+4,x+16,y+16); break; case 1://画回出生地道具图标 g.setColor(Color.white); g.drawRoundRect(x, y, 20, 20, 5, 5); g.setColor(mycolor3); g.fillRoundRect(x+5, y+5, 10, 10, 5, 5); break; case 2://画增加子弹数目道具//? g.setColor(mycolor2); g.fill3DRect(x-15,y+8,30,5,false); g.fill3DRect(x-15,y+6,10,10,true); g.fillOval(x+15,y+7,7,7); break; case 3://画炸弹 g.setColor(mycolor2); g.fillRect(x, y, 21, 21); g.setColor(Color.black); g.fillRect(x+8,y+6,6,2); g.fillOval(x+3,y+7,14,14); g.drawLine(x+11, y+3, x+11, y+6); g.setColor(Color.white); g.drawLine(x+11, y+15, x+8, y+14); break; case 4://画小坦克道具 g.setColor(Color.yellow); g.fill3DRect(x,y,20,3,true); g.fill3DRect(x,y+10,20,3,true); g.fill3DRect(x+3,y+3,14,7,false); g.fillOval(x+6,y+3,7,7); g.drawLine(x-7,y+6,x+7,y+6); break; } } } } } //坦克大战: 不会做多关卡??!! //IO声音流没做,IO流存储也有点问题,有BUG继续游戏的时候看不到爆炸一下才能看到地方坦克, import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; import java.io.*; public class Tank1 extends JFrame implements ActionListener{ MyPanel mp=null; StartPanel gkmp=null; //Record record=null; JMenuBar cd=null;//??不熟 JMenu cd1=null;//??不熟 JMenu cd2=null; JMenuItem cd1xl1=null;//菜单栏1系列的1 JMenuItem cd1xl2=null;//菜单栏1系列的2 JMenuItem cd1xl3=null;//菜单栏1系列的1 JMenuItem cd1xl4=null;//菜单栏1系列的2 JMenuItem cd2xl1=null;//菜单栏2系列的1 JLabel imageJLabel=null; String newGame="newGame";//? //Image tp1=null; public static void main(String[] args) { Tank1 t1=new Tank1(); } public Tank1(){ gkmp=new StartPanel(); mp=new MyPanel(newGame);//?? Record record=new Record();//创建一个记录对象 Thread t=new Thread(gkmp); t.start(); cd=new JMenuBar();//菜单栏 不熟 cd1=new JMenu("游戏(G)");//第一个菜单栏的第一个菜单 cd1.setMnemonic('G');//快界键 cd2=new JMenu("设置(Z)"); cd2.setMnemonic('Z'); cd1xl1=new JMenuItem("开始新游戏(N)");//菜单系列 cdxl cd1xl1.setMnemonic('N'); cd1xl1.addActionListener(this);//加组件监听 cd1xl1.setActionCommand("newGame");//设置键值,和上文同名参数有啥关系没? cd1.add(cd1xl1); cd1xl2=new JMenuItem("继续游戏(H)");//菜单系列 cdxl cd1xl2.setMnemonic('H'); cd1xl2.addActionListener(this);//加组件监听 cd1xl2.setActionCommand("goonGame");//设置键值 cd1.add(cd1xl2); cd1xl3=new JMenuItem("保存退出(S)");//菜单系列 cdxl cd1xl3.setMnemonic('S'); cd1xl3.addActionListener(this);//加组件监听 cd1xl3.setActionCommand("saveOut");//设置键值 cd1.add(cd1xl3); cd1xl4=new JMenuItem("退出(Q)"); cd1xl4.setMnemonic('Q'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("exit");//设置键值 cd1.add(cd1xl4); cd.add(cd1);//给菜单栏 cd 添加菜单 cd1 cd2xl1=new JMenuItem("速度(F)");//菜单系列 cdxl 没做好效果? cd1xl4.setMnemonic('F'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("FSpeed");//设置键值 cd2.add(cd2xl1); cd.add(cd2); ImageIcon img = new ImageIcon("E:/Tank1/tankebig.PNG"); JLabel imageJLabel = new JLabel(img); gkmp.add(imageJLabel); this.add(gkmp); this.setJMenuBar(cd); this.setTitle("坦克大战"); ImageIcon tp1=new ImageIcon("E:/Tank1/tankexiao.PNG");//设置小图标地址要写全路径 this.setIconImage(tp1.getImage()); this.setSize(700,620); this.setLocation(300,80); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//可见 this.setResizable(false);//可调 // this.setResizable(true); } public void actionPerformed(ActionEvent e){ //boolean flag=true; if(e.getActionCommand().equals("newGame")) { this.remove(gkmp);//取消界面 gkmp if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("newGame"); } this.add(mp); this.addKeyListener(mp); Thread t=new Thread(mp);//启动我的MyPanel模板对象mp的线程 t.start();//叫醒线程 this.setVisible(true);//因为默认的是不可见,必须写这个!! Record.bcjl();//???? }else if(e.getActionCommand().equals("saveOut")) { Record record0=new Record(); // record0.setDtk(mp.dtk); record0.cunpan();///?????? System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("exit")) { Record.bcjl(); System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("goonGame")){ this.remove(gkmp); if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("goonGame"); } Thread t=new Thread(mp); t.start(); this.add(mp); this.addKeyListener(mp); this.setVisible(true); } } class StartPanel extends JPanel implements Runnable //开始界面类 { int time=0; public void paint(Graphics g){ super.paint(g); // g.fillRect(0, 0, 600, 500);//设置画布 g.setColor(Color.black);//设置颜色 Color mycolor1=new Color(250,50,0);//自定义红色 g.setFont(new Font("华文琥珀",Font.BOLD,80));//设置字体//? g.drawString("坦克大战",190 , 460);//绘字符串 g.setColor(Color.black);//设置颜色 g.setFont(new Font("黑体",1,14));//设置字体 g.drawString("李晋祥",648 , 552);//绘字符串 if(time%2==0) { g.setColor(Color.white);//设置颜色 g.setFont(new Font("华文行楷",3,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("准备战斗",270 , 345);//绘字符串 } } StartPanel(){ } public void run(){ while(true){ try{ Thread.sleep(400); }catch(Exception e){} time++; this.repaint(); } } } class MyPanel extends JPanel implements KeyListener,Runnable { //Vector<MyTank> mts=new Vector<MyTank>();//建立一个我的坦克集合类可以出无限个坦克 MyTank mt=null; MyTank mt0=null; MyTank mt01=null; MyTank mt02=null; Vector<DiTank> dtk=new Vector<DiTank>();//建立一个敌坦克集合类 Props props=null; Vector<Baozha> bzjh=new Vector<Baozha>();//创建一个爆炸类的集合 Vector<Weizhi> wzjh=new Vector<Weizhi>();//建立一个位置集合类,为啥建立这集合类 int tksl=3;//坦克数量 int a=122; int b=455; int n=10; int myzdNum=4;//? int propsSort=5; int time=0; boolean flag=true;//标记是不是已经创建过MyPanel类 boolean b1=false; int x=1;//总关卡数? int rocket=1;//没用? int huopao=0;//? Color mycolor1=new Color(250,50,0);//自定义红色 Color mycolor2=new Color(0,250,50);//自定义绿色 Color mycolor3=new Color(0,50,250);//自定义兰色 Color mycolor11=new Color(130,200,0);//自定义土黄 Color mycolor31=new Color(0,100,200);//自定义兰色 Color mycolor21=new Color(0,250,0);//自定义绿色 JLabel imageJLabel0=null; JLabel imageJLabel1=null; ImageIcon img0=null;//? ImageIcon img1=null;//? public MyPanel(String ss) { ImageIcon img0 = new ImageIcon("e:/Tank1/background.jpg"); JLabel imageJLabel0 = new JLabel(img0); this.add(imageJLabel0); Record.dqjl();//? mt=new MyTank(600,280);//new多个可改为多个坦克,循环数组 mt0=new MyTank(550,280);//new多个可改为多个坦克,循环数组 mt01=new MyTank(550,330);//new多个可改为多个坦克,循环数组 mt02=new MyTank(600,330);//new多个可改为多个坦克,循环数组 props=new Props(30,30);//没有实际意义,为了new对象,必须要有个参数? if(ss.equals("newGame")){ // record=new Record(); for(int i=0;i<tksl;i++){ DiTank dt=new DiTank((i)*a,b);//添加出场敌坦 // dt.dtkxl(dtk);///???是不是敌人坦克血量 dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } }else if(ss.equals("goongame")){//继续游戏有问题 感觉读取存盘信息有问题 wzjh=Record.dupan(); for(int i=0;i<wzjh.size();i++){ Weizhi wz=wzjh.get(i); DiTank dt=new DiTank(wz.x,wz.y);//添加出场敌坦 dt.setFangxiang(wz.fangxiang); // dt.dtkxl(dtk);//?敌坦克血量,好像暂时用不着 // dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } } flag=false;//MyPanel类的mp创建过一次就标记为假 // this.repaint(); // Record.next(); // if(Record.next()%2!=0){ // Record.reMtNum();//需要吗? // Record.reDtNum();//需要吗? // Record.reAddMtNum(); // } } public void outNum(Graphics g)//画出统计数据的方法也即使显示数量的函数 { g.setColor(Color.cyan); this.drawTank(500,150,g,0,0);//引用drawtank()的不能是g,而是this this.drawTank(570,150,g,0,1); this.drawTank(500,70,g,0,1); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20));//??换换字体效果 g.drawString(Record.getDtNum()+"",600,170); if((Record.getMtNum()+Record.getAddMtNum())>=0){ g.drawString((Record.getMtNum()+Record.getAddMtNum())+"",530,170);// }else{ g.drawString((Record.getAddMtNum())+"",530,170); } g.setColor(Color.blue); g.setFont(new Font("方正小标宋",1,17)); g.drawString("干掉的坦克总数:",510,40); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20)); g.drawString(Record.getSumDtNum()+"",530,90); g.setColor(Color.MAGENTA);//设置颜色 g.setFont(new Font("隶书",0,20));//设置字体 g.drawString("第"+x+"关",500 , 200);//绘字符串 } public void paint(Graphics g){//这个方法每当窗口激活,最小化,调用repaint()方法都会运行,线程中调用就一直显示 super.paint(g); // g.fillRect(0,0,400,300);//做个背景画布,默认黑色 this.outNum(g);//调用显示数量的函数 g.setColor(Color.red);//设置颜色 g.fillRect(530, 210, 30, 20); g.setColor(Color.black);//设置颜色 g.drawLine(530, 210, 530, 320); g.setColor(mycolor11);//设置颜色 if(mt.live==true){ this.drawTank(mt.getX(),mt.getY(),g,mt.fangxiang,0); } if(mt0.live==true){ this.drawTank(mt0.getX(),mt0.getY(),g,mt0.fangxiang,2); } if(mt01.live==true){ this.drawTank(mt01.getX(),mt01.getY(),g,mt01.fangxiang,2); } if(mt02.live==true){ this.drawTank(mt02.getX(),mt02.getY(),g,mt02.fangxiang,2); } if(mt.getLive()==false){ g.setColor(mycolor11);//设置颜色 g.setFont(new Font("Gill Sans Ultra Bold Condensed",1,40));//字体:华康楷体, Ravie, OCR A Extended g.drawString("game over...",200 , 220);//绘字符串 this.repaint(); } if(Record.getDtNum()%6==0&&(Record.getDtNum()>10)){ // if(time%2==0) // { g.setColor(Color.blue);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("你行不行?",310 , 265);//绘字符串 // } } if(Record.getDtNum()==0){ g.setColor(Color.red);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("过关!",300 , 265);//绘字符串 } for(int i=0;i<dtk.size();i++)//画敌人坦克asd { DiTank dt=dtk.get(i); if(dt.live==true){ this.drawTank(dt.getX(),dt.getY(),g,dt.fangxiang,1);//??!!注意用法用dtk 还是dt调用 } } for(int i=0;i<mt.aa.size();i++)//画我的子弹 { Zidan zd=mt.aa.get(i); if(mt.zd!=null&&mt.zd.live==true) //???画子弹的条件 { //g.fill3DRect((mt.zd.x-2),(mt.zd.y-2), 8, 8, false); //???画子弹火力圈 g.setColor(Color.black);//子弹颜色设置为白色 g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false) { mt.aa.remove(zd); } } //this.repaint();//? for(int i=0;i<dtk.size();i++)//画敌人的子弹 { DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++) { Zidan zd=dt.dzd.get(j); if(zd!=null&&dtk.get(i).live==true) { g.setColor(Color.red);//子弹颜色设置为红色,次处不进循环是不是更好? g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false)//删除生命为假的敌人子弹???? { dt.dzd.remove(zd); } } } for(int i=0;i<bzjh.size();i++) //画爆炸 { Baozha bz=bzjh.get(i); if(bzjh.get(i).livetime>140){ g.setColor(Color.red); g.fillOval(bz.x, bz.y+5, 20,20 );//代替上面的句子 //g.fillOval(bz.x, bz.y, 20,5 );//可以用来做合成图形,但是要定好坐标点 }else if((bzjh.get(i).livetime<=100)&&(bzjh.get(i).livetime>50)){ g.setColor(Color.orange); g.fillOval(bz.x+4, bz.y+9, 12,12 ); }else if((bzjh.get(i).livetime<=50)&&(bzjh.get(i).livetime>20)){ g.setColor(Color.yellow); g.fillOval(bz.x+7, bz.y+11,5,5 ); }else{ g.setColor(Color.pink); g.fillOval(bz.x+10, bz.y+13,2,2 ); } bz.ltjs(); //生存时间减少函数 if(bz.livetime==0){ bzjh.remove(bz); } } // if(props.live==true){//画道具 this.drawProps(props.getX(),props.getY(),g,props.getleixing()); } //} this.repaint();//教学视频少了这句,子弹无法自主运行,主类启动线程后仍然可动 } public void keyPressed(KeyEvent e)//键盘输入事件 { if(mt.getLive()==true){ if(e.getKeyCode()==KeyEvent.VK_W){ this.mt.setFangxiang(0); this.mt.xiangshang(); }else if(e.getKeyCode()==KeyEvent.VK_S){ this.mt.setFangxiang(1); this.mt.xiangxia(); }else if(e.getKeyCode()==KeyEvent.VK_A){ this.mt.setFangxiang(2); this.mt.xiangzuo(); }else if(e.getKeyCode()==KeyEvent.VK_D){ this.mt.setFangxiang(3); this.mt.xiangyou(); } if(e.getKeyCode()==KeyEvent.VK_J) { if((mt.aa.size()<myzdNum)&&(mt.live==true))//子弹设置最多 myzdNum 发 { this.mt.fszd();//调用发射子弹函数 } } } } public void crash(){ } public boolean addprops(Props props,MyTank mt)//吃道具触发 方法 (道具功能触发模型为边长20的正方形) { boolean b2=false; switch(props.leixing){ case 0://我的坦克速度提高//mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.sudu=20; b2=true; } break; case 1://效果回到出生地 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.setX(630); mt.setY(280); b2=true; } break; case 2://提高我可以发射的子弹数目 //mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; this.myzdNum=30; this.huopao=1; this.n=4; b2=true; } break; case 3://显示的敌人坦克全死,但实际效果是..是不出敌方坦克了!!!! if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; for(int i=0;i<dtk.size();i++){ if(dtk.get(i).live==true){ dtk.get(i).live=false; Record.setDtNum();//有几个活坦克生命变假,就累计几辆dtNum } } b1=true; b2=true; } break; case 4://吃道具加命 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; Record.setAddMtNum(); b2=true; // System.out.println("吃道具加命程序,正常运行"); } break; } return b2; } // addMyTank++; //MyTank mt1=new MyTank(mt.getX(),mt.getY());//??创建另一个MyTank对象 // public void setAddMytank(){ // addMyTank++; // }; // public static int getAddMytank(){ // return addMyTank; // }; public void run() //我的画板的 线程函数 { while(true){ try{ Thread.sleep(50);// }catch(Exception e){} for(int i=0;i<mt.aa.size();i++)//我的子弹集中敌坦克的线程 { Zidan myzd=mt.aa.get(i); if(myzd.live){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j); // Zidan zd=dt.dzd.get(j);//为啥dzd可以直接用,不用创建// ||(b1==true&&Record.getDtNum()>0) if(dt.live)//内关联敌人坦克重生的一种情况,有敌人坦克被打中 { if(this.jzsf(myzd,dt)&&((Record.getDtNum()-tksl)>=0)){//调用jzsf(),打中同时,坦克定点?及时重生 DiTank dt0=new DiTank((int)(Math.random()*50+5)*10,(int)(Math.random()*100+450)); Thread t2=new Thread(dt0); t2.start(); Zidan zd0=new Zidan(dt0.x,dt0.y,dt0.fangxiang); Thread t3=new Thread(zd0); t3.start(); dt0.dzd.add(zd0); dtk.add(dt0); } } } } } if(Record.getDtNum()>=tksl&&b1==true){ //炸弹爆炸,敌坦克按条件重生, for(int i=0;i<tksl;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-1))&&(b1==true)){ for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-2))&&(b1==true)){ // for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); b1=false; } for(int j=0;j<dtk.size();j++)//敌人的子弹击中我的坦克的线程 { DiTank dt=dtk.get(j);//取出所有敌方坦克 for(int i=0;i<dt.dzd.size();i++) { Zidan zd=dt.dzd.get(i);//? if(zd.live) { if(this.jzsf(zd,mt)==true){//调用 击中敌坦 函数 } } } } if((this.time%120)==0){//6秒发生1次 道具随机重置//draw mt hit props props.live=true; // props.leixing=2; props.leixing=(int)(Math.random()*propsSort); props.x=(int)(Math.random()*370); props.y=(int)(Math.random()*270); props.livetime=100;//道具生存期 } if(props.livetime>0){//道具生存期变化 props.livetime--; }else{ props.live=false; } if(mt.live==true&&props.live==true){//调用 吃道具 方法 this.addprops(props,mt); } time++; // if(SaveData.getSumDtNum()%20==0){ // Record.next(); // } this.repaint();//线程运行中重绘?? } } public void jzwf()//敌人子弹集中我方坦克的方法 { for(int i=0;i<this.dtk.size();i++){ DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++){ Zidan zd=dt.dzd.get(j); this.jzsf(zd, mt); } } } public void jzdf() //我的子弹击中坦克的方法 { for(int i=0;i<mt.aa.size();i++){ Zidan zd=mt.aa.get(i);//从我的子弹集合类取我的各个子弹 if(zd.live==true){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j);//从敌坦克集合类取出各个敌坦克 if(dt.live){ this.jzsf(zd,dt); // levelDtNum--; } } } this.repaint(); } } public boolean jzsf(Zidan zd,Tank tk)//击中双方的方法 { boolean b2=false; switch(tk.fangxiang) { case 0: case 1: if(zd.x>tk.x&&zd.x<tk.x+20&&zd.y>tk.y&&zd.y<tk.y+30)//分辨率判断? { if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum(); Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(140); mt.setY(232); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; case 2: case 3: if(zd.x>tk.x&&zd.x<tk.x+30&&zd.y>tk.y&&zd.y<tk.y+20){ if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum();//每次敌人坦克数量-1 Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(550); mt.setY(270); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; } return b2; } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing)//画坦克函数 { int m=10; //double n=1; switch(leixing)//不同阵营坦克 { case 0://我的坦克 g.setColor(Color.yellow);// 我的坦克颜色 黄色 // g.fillOval(170*huopao, 240*huopao, 30*huopao, 30*huopao); m=11; break; case 1://敌人的坦克 g.setColor(mycolor3);//敌人坦克颜色 蓝色 // m=15; break; case 2://玩家2的坦克 g.setColor(mycolor1);//敌人坦克颜色 绿色 break; } switch(fangxiang)//不同方向的坦克(0,1,2,3)分别代表上下左右,中心原点不变做坐标变换 { case 0://上 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y-5,x+10,(y+10)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 1://下 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y+10,x+10,(y+35)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 2://左 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x-10)+n-m,y+15,(x+10),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 3://右 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x+10)-n+m,y+15,(x+30),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; } } public void drawProps(int x,int y,Graphics g,int leixing)//画道具 { if(time%8==0){ switch(leixing) { case 0://画车轮对应坦克加速 g.setColor(Color.white); g.fillOval(x, y, 21, 21); g.setColor(Color.black); g.fillOval(x+2,y+2,16,16); g.setColor(Color.white); g.drawOval(x+2,y+2,16,16); g.drawLine(x+2,y+10,x+18,y+10); g.drawLine(x+10,y+2,x+10,y+18); g.drawLine(x+16,y+4,x+4,y+16); g.drawLine(x+4,y+4,x+16,y+16); break; case 1://画回出生地道具图标 g.setColor(Color.white); g.drawRoundRect(x, y, 20, 20, 5, 5); g.setColor(mycolor3); g.fillRoundRect(x+5, y+5, 10, 10, 5, 5); break; case 2://画增加子弹数目道具//? g.setColor(mycolor2); g.fill3DRect(x-15,y+8,30,5,false); g.fill3DRect(x-15,y+6,10,10,true); g.fillOval(x+15,y+7,7,7); break; case 3://画炸弹 g.setColor(mycolor2); g.fillRect(x, y, 21, 21); g.setColor(Color.black); g.fillRect(x+8,y+6,6,2); g.fillOval(x+3,y+7,14,14); g.drawLine(x+11, y+3, x+11, y+6); g.setColor(Color.white); g.drawLine(x+11, y+15, x+8, y+14); break; case 4://画小坦克道具 g.setColor(Color.yellow); g.fill3DRect(x,y,20,3,true); g.fill3DRect(x,y+10,20,3,true); g.fill3DRect(x+3,y+3,14,7,false); g.fillOval(x+6,y+3,7,7); g.drawLine(x-7,y+6,x+7,y+6); break; } } } } }
急!ssh项目出错Error setting value [[Ljava.lang.String;@1597a48]
## spring:4.1.5 ## struts2:2.3.20 ## hibernate:4.3.8 spring和struts已配置验证码的action **Tomcat启动后没错误,进入到注册页面也没错误,点四位验证码更换时(如图)** ![图片说明](https://img-ask.csdn.net/upload/201504/17/1429253521_910834.png) **myeclipse的Console报如下错误:** WARN OgnlValueStack:68 - Error setting value [[Ljava.lang.String;@1597a48] with expression [1429250952505] java.lang.NumberFormatException: For input string: "1429250952505" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:495) at java.lang.Integer.valueOf(Integer.java:556) at ognl.OgnlParserTokenManager.makeInt(OgnlParserTokenManager.java:63) at ognl.OgnlParserTokenManager.TokenLexicalActions(OgnlParserTokenManager.java:1624) at ognl.OgnlParserTokenManager.getNextToken(OgnlParserTokenManager.java:1498) at ognl.OgnlParser.jj_ntk(OgnlParser.java:3099) ...... ================================================= 注册页面jsp: ``` <tr> <th> <span class="requiredField">*</span>验证码: </th> <td> <span class="fieldSet"> <input type="text" id="checkcode" name="checkcode" class="text captcha" maxlength="4" autocomplete="off"/> <img id="checkImage" class="captchaImage" src="${pageContext.request.contextPath}/checkImage.action" onclick="changeImage()" title="点击更换验证码"/> </span> </td> </tr> ``` 切换验证码的js代码: ``` function changeImage(){ var img = document.getElementById("checkImage"); img.src="${pageContext.request.contextPath}/checkImage.action?" + new Date().getTime(); } ``` action代码: ``` import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.Random; import javax.imageio.ImageIO; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /** * 验证码Action类 * @author donny * @E-mail donnymoving@gmail.com * @version 2015-4-17 上午12:04:16 */ public class CheckImageAction extends ActionSupport { @Override public String execute() throws Exception { int width = 120; int height = 30; // 步骤一 绘制一张内存中图片 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 步骤二 图片绘制背景颜色 ---通过绘图对象 Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔 // 绘制任何图形之前 都必须指定一个颜色 graphics.setColor(getRandColor(200, 250)); graphics.fillRect(0, 0, width, height); // 步骤三 绘制边框 graphics.setColor(Color.WHITE); graphics.drawRect(0, 0, width - 1, height - 1); // 步骤四 四个随机数字 Graphics2D graphics2d = (Graphics2D) graphics; // 设置输出字体 graphics2d.setFont(new Font("宋体", Font.BOLD, 18)); String words ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; Random random = new Random();// 生成随机数 // 定义StringBuffer StringBuffer sb = new StringBuffer(); // 定义x坐标 int x = 10; for (int i = 0; i < 4; i++) { // 随机颜色 graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110))); // 旋转 -30 --- 30度 int jiaodu = random.nextInt(60) - 30; // 换算弧度 double theta = jiaodu * Math.PI / 180; // 生成一个随机数字 int index = random.nextInt(words.length()); // 生成随机数 0 到 length - 1 // 获得字母数字 char c = words.charAt(index); sb.append(c); // 将c 输出到图片 graphics2d.rotate(theta, x, 20); graphics2d.drawString(String.valueOf(c), x, 20); graphics2d.rotate(-theta, x, 20); x += 30; } // 将生成的字母存入到session中 ServletActionContext.getRequest().getSession().setAttribute("checkcode", sb.toString()); // 步骤五 绘制干扰线 graphics.setColor(getRandColor(160, 200)); int x1; int x2; int y1; int y2; for (int i = 0; i < 30; i++) { x1 = random.nextInt(width); x2 = random.nextInt(12); y1 = random.nextInt(height); y2 = random.nextInt(12); graphics.drawLine(x1, y1, x1 + x2, x2 + y2); } // 将上面图片输出到浏览器 ImageIO graphics.dispose();// 释放资源 ImageIO.write(bufferedImage, "jpg", ServletActionContext.getResponse() .getOutputStream()); return NONE; } /** * 取其某一范围的color * * @param fc * int 范围参数1 * @param bc * int 范围参数2 * @return Color */ private Color getRandColor(int fc, int bc) { // 取其随机颜色 Random random = new Random(); if (fc > 255) { fc = 255; } if (bc > 255) { bc = 255; } int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } } ``` struts配置: ![图片说明](https://img-ask.csdn.net/upload/201504/17/1429260370_810846.png) 没有result,因为验证码不需要跳转页面,execute()返回NONE,只起显示作用。
JQuery插件-HighCharts 一个令我蛋疼的事 求教、、
<div class="quote_title">引用</div><div class="quote_div"> <br />&nbsp; 最近在做一个监控系统,需要制作两个图形,一个度盘,一个波形图,最先开始使用了JFreeChart绘制图形,但是在服务器端绘制图形鸭梨很大,占用带宽多,浏览图形不畅快,抛弃之。 <br />&nbsp;&nbsp;&nbsp; 然后觉得可以使用Java Applet在客户端绘制图形,但是这个要求JRE环境,于是也被无情的抛弃了。 <br />&nbsp;&nbsp;&nbsp; 然后在网上找了会,发现一个HighCharts类库,一个JQuery插件,使用这个绘制出来的图形挺好看的,效果也令人满意,但是目前跟AJAX结合之后,highcharts制造出来的内存一直没有删除,PF使用率以每秒3MB的速度网上猛涨,令人大感鸭梨、、、(波形图现在困到这一个内存问题了) <br />&nbsp;&nbsp; 最后的度盘,在刚开始采用的Highcharts画的饼图,弄的一块一块的 效果也差,所以在GOOGLE了把JS绘图技术,搜出了 令我大感兴奋的矢量绘图技术,SVG AND VML,SVG支持除IE外大部分的浏览器,VML仅支持IE5以上的浏览器器,所以采用了SVG+VML结合在浏览器中绘图,图形不错,最后结合AJAX也没有发现内存问题。 <br />&nbsp;&nbsp; 所以现在在这想跟大家讨论一下HighCharts的使用、、请各位发表意见 <br /> <br /></div>自己要做一个实时的监控数据的图形,但是跟AJAX结合的时候,内存增长的速度 比较快,谁能帮我看看怎么回事,谢谢了!<img src="/images/smiles/icon_redface.gif"/> <br /><pre name="code" class="java"> waveLineImage = { chart: { renderTo: 'waveImage', //绘制到DIV容器中,根据ID defaultSeriesType: 'line', //绘制类型 目前是曲线 plotBorderWidth: 1, plotBorderColor: '#99CC99', marginRight: 12, showAxes: true }, title: { text: '', x: -20 //center }, xAxis: { tickWidth: 0, tickInterval: 5, gridLineWidth: 1, gridLineColor: '#99CC99', categories: [] }, yAxis: { title: { text: '' }, min: -1, tickInterval: 5, gridLineWidth: 1, gridLineColor: '#99CC99' }, plotOptions: { series: { animation: false, marker: { enabled: false } } }, tooltip: { enabled:false, formatter: function(){ return null; } }, legend: { enabled: false }, exporting: { enabled: false }, series: [{ name: "monitor", data: [] }, { name: "temp", data: [] }] }</pre> <br /> <br />上面是 初始化曲线图的实例 <br /> <br /><pre name="code" class="java"> var tempArray = null; function drawOscillogram(waveData){ if (waveData) { //传输过来的JSON数据 var dataArray = new Array(); var array = null, point = null, num = null,item = null; var waveDataLength = waveData.length; for (var i = 0; i &lt; waveDataLength; i++) { array = waveData[i].split(","); point = 1 / array.length; for (var j = 0; j &lt; array.length; j++) { num = i + Math.round((point * j) * 10) / 10; item = parseFloat(array[j]); dataArray.push([num, item]); num = null; } array = null; item = null; point = null; } if (waveDataLength &lt; 60) { //当不足60个点时,创建一个临时的数据,绑定到temp当中 if (tempArray == null) { tempArray = new Array(); for (var i = 0; i &lt; 61; i++) { tempArray.push([i, -6]); } } if(!waveLineImage.series[1]) waveLineImage.addSeries("",true,false); waveLineImage.series[1].data = tempArray; } else { tempArray = null; waveLineImage.series[1].remove(); } waveLineImage.series[0].data = dataArray; dataArray = null; waveDataLength = null; waveLineImage.redraw(); //重新绘制HighCharts图形 new Highcharts.Chart(waveLineImage); //绘制HIghcharts图形,这一句会生成大内 //存,想直接调用redraw重绘方法,完成绘图,这样不用重新刷新区域,而是在旧的基础上绘制,会减少内存,但 //是曲线什么都显示不出来 } } </pre> <br /> <br />waveData 是 传过来的 数据,把他绑定到图形中 ,内存长的飞快,每秒3MB,怎么修改,怀疑是//new Highcharts.Chart(waveLineImage);这句话增长的内存,然后调用 highCharts 的redraw 方法,重画,可是没有效果出来 求高手 提错!!!!<br/><strong>问题补充</strong><br/>上面有做出来的效果图,可以下载出来看一下、、 <br /> <br />另外HighCharts有一个redraw重绘方法,但是应该怎么调用呢,我调用无效!<br/><strong>问题补充</strong><br/>主要就是内存的方面了,也看了好多的JavaScript方面性能问题,内存释放问题,但是都不太理想,<br/><strong>问题补充</strong><br/> <br /><table class="bbcode"><tr><td>怎么没人回复啊 泪奔、、</td><td>太遗憾了吧</table><br/><strong>问题补充</strong><br/><div class="quote_title">引用</div><div class="quote_div"><ul> <li>用不用我加点注释 、、 汗 </li><li>哪一点有问题啊 泪奔中、、 </li><li>不回复也得顶起来啊 呜呜、 </li><li>大家都来探讨一下啊 呵呵 </li><li>大家在客户端都用什么方法绘制图表呢 </li></ul></div><br/><strong>问题补充</strong><br/><img src="/images/smiles/icon_sad.gif"/>&nbsp;<img src="/images/smiles/icon_surprised.gif"/>&nbsp;<img src="/images/smiles/icon_lol.gif"/>&nbsp;<img src="/images/smiles/icon_cool.gif"/>&nbsp;<img src="/images/smiles/icon_confused.gif"/>&nbsp;<img src="/images/smiles/icon_eek.gif"/>&nbsp;<img src="/images/smiles/icon_mad.gif"/>&nbsp;<img src="/images/smiles/icon_razz.gif"/>&nbsp;<img src="/images/smiles/icon_redface.gif"/>&nbsp;<img src="/images/smiles/icon_cry.gif"/> <br/><strong>问题补充</strong><br/><div class="quote_title">引用</div><div class="quote_div"><ul> <li><span style="color: #00ff00">咱么是顶起呢?还是顶起呢?呵呵</span> </li><li><span style="color: #0000ff">咱么是顶起呢?还是顶起呢?呵呵</span> </li><li><span style="color: red">顶顶顶 力压千钧</span> </li><li><span style="color: black">虽说晚上不上班 也不至于吧</span> </li><li><span style="color: #adefaa">有哪一点会是不好的 大大们都去哪了</span> </li></ul></div><br/><strong>问题补充</strong><br/><div class="quote_title">奥义之舞 写道</div><div class="quote_div"><div class="quote_title">引用</div><div class="quote_div"><ul> <li><span style="color: #00ff00">咱么是顶起呢?还是顶起呢?呵呵</span> </li><li><span style="color: #0000ff">看帖不回帖 很不给力啊</span> </li><li><span style="color: red">顶顶顶 力压千钧</span> </li><li><span style="color: black">虽说晚上不上班 也不至于吧</span> </li><li><span style="color: #adefaa">有哪一点会是不好的 大大们都去哪了</span> </li></ul></div></div> <br />+1<br/><strong>问题补充</strong><br/><div class="quote_title">引用</div><div class="quote_div">在highcharts官网http://www.highcharts.com/ref/#chart-object查了很久,经过测试,发现一个方法可行,很给力的时刻,修改了点代码,现在使用这种代码之后,可以保持在120KB/s左右的增长率</div> <br />修改后的代码:<pre name="code" class="java">waveLineImage = new Highcharts.Chart({ chart: { renderTo: 'waveImage', //绘制到DIV容器中,根据ID defaultSeriesType: 'line', //绘制类型 目前是曲线 plotBorderWidth: 1, plotBorderColor: '#99CC99', marginRight: 12, showAxes: true }, title: { text: '', x: -20 //center }, xAxis: { tickWidth: 0, tickInterval: 5, gridLineWidth: 1, gridLineColor: '#99CC99', categories: [] }, yAxis: { title: { text: '' }, min: -1, tickInterval: 5, gridLineWidth: 1, gridLineColor: '#99CC99' }, plotOptions: { series: { animation: false, marker: { enabled: false } } }, tooltip: { enabled:false, formatter: function(){ return null; } }, legend: { enabled: false }, exporting: { enabled: false }, series: [{ name: "monitor", data: [] }, { name: "temp", data: [] }] });</pre> 直接实例化绘图对象 <br /><pre name="code" class="java"> var tempArray = null; function drawOscillogram(waveData){ if (waveData) { //传输过来的JSON数据 var dataArray = new Array(); var array = null, point = null, num = null,item = null; var waveDataLength = waveData.length; for (var i = 0; i &lt; waveDataLength; i++) { array = waveData[i].split(","); point = 1 / array.length; for (var j = 0; j &lt; array.length; j++) { num = i + Math.round((point * j) * 10) / 10; item = parseFloat(array[j]); dataArray.push([num, item]); num = null;item=null; } array = null; item = null; point = null; } array = null; item = null; point = null; num = null; item=null; if (waveDataLength &lt; 60) { //当不足60个点时,创建一个临时的数据,绑定到temp当中 if (tempArray == null) { tempArray = new Array(); for (var i = 0; i &lt; 61; i++) { tempArray.push([i, -6]); } } if(!waveLineImage.series[1]) waveLineImage.addSeries("",true,false); waveLineImage.series[1].setData(tempArray); } else { tempArray = null; waveLineImage.series[1].remove(); } waveLineImage.series[0].setData(dataArray); //在这里通过setData方法设置数据 dataArray = null; waveDataLength = null; waveLineImage.redraw(); //这样调用图例对象的重绘方法可以找的到数据,以前数 //据是设置到JSON里面了,这个对象的数据应该没有更新 } } </pre> <br />不过这种现在仍然有100多KB的增长率,对于一个长期停留在页面中不刷新的局面,仍然是一个问题,各位老大们,有没有一个很好的意见提出来,让我继续改进,thank you<br/><strong>问题补充</strong><br/><div class="quote_title">tanqimin 写道</div><div class="quote_div">这个图表真的很蛋痛!</div> <br />哥们这个图表怎么了,很好看啊 呵呵 就是性能有点扯淡,不过性能是决定页面技术的优先选择、、 <br />很惆怅&nbsp;<img src="/images/smiles/icon_eek.gif"/> <br/><strong>问题补充</strong><br/><div class="quote_title">夜之son 写道</div><div class="quote_div">想让大家说什么呢,图太少,不给力。</div> <br />ok 上图 <br/><strong>问题补充</strong><br/>另外这个是VML画的度盘,跟AJAX结合 也不卡,很给力啊 呵呵 推荐 SVG + VML 结合 一秒 10多KB的增长量<br/><strong>问题补充</strong><br/>发现看英文文档狠让人蛋疼的事,有木有,中文帮助文档在哪里 呜呜 <br /> <br /><div class="quote_title">引用</div><div class="quote_div"> <br />希望对我的循环提出哪里可以优化点在、、感觉这里面也会浪费点性能 <br />希望最后能把PF增长率 控制在 10KB以内 <br />希望告我一个 JS代码 控制页面刷新的 代码 <br />这样我可以再内存增长到一定程度的时候 刷新释放内存 <br /></div><br/><strong>问题补充</strong><br/><div class="quote_title">hyj1254 写道</div><div class="quote_div">highChart我也在用,倒是没深究内存增长的问题。它也是vml+svg。内存不释放跟js代码和浏览器自身实现方式都有关系,有些情况你是无法有效释放内存的:比如在ie中,希望刷新释放内存是无法实现的,你可以到taobao、google地图等网站验证下,它默认将所有的页面元素都缓存起来,因此即使js完全没有问题它所占的内存也会越来越大。但chrome就好得多,每次刷新都显著地释放一些内存。至于highChart你可以到官网上反映下,看是否是内存泄露导致的。</div>+1 <br /><div class="quote_title">引用</div><div class="quote_div">用的浏览器 IE 和 火狐的 ,谷歌到没有看,不过同事通过谷歌浏览器访问了一下,正常,内存这块到没有看,这个浏览器的问题一直在关注, IE 和 FireFox的 掐架 一直没有停止 、、、</div> <br /><div class="quote_title">引用</div><div class="quote_div"> <br />&nbsp;&nbsp; 另外JS代码构造对象和释放对象之间,这个度由于刚开始关注性能问题,也没能做的很好,大家看到哪一点可以优化的,可以提出来、、 <br />over&nbsp;<img src="/images/smiles/icon_cry.gif"/>&nbsp;<img src="/images/smiles/icon_lol.gif"/>&nbsp;<img src="/images/smiles/icon_surprised.gif"/> <br /></div> <br /> <br /><br/><strong>问题补充</strong><br/><div class="quote_title">clue 写道</div><div class="quote_div">哦哦。。。原来是HighCharts <br />官方声称是有解决内存泄漏问题,但关键是。。。它指的泄漏是关闭浏览器仍不释放的泄漏,而非运行中释放 <br /> <br />基本上,想要解决难度很大,几乎底层代码都要过一遍,加上清理事件、解除Dom引用的逻辑。 <br />好像excanvas也需要一同改进 <br /> <br />HighCharts代码不便放出(就算放出也没用,版本低,改动大),但还是能做到将近0增长的。 <br /> <br />P.S. 推荐使用sIEve查看IE下Dom节点释放情况,JS本身的GC是很完善的,但与Dom循环引用就无能为力了。所以查看Dom节点的释放情况就知道是哪里有泄漏了。</div> <br />高手、、那按照你这样说,我要想做到内存0增长或近0增长,必须修改highcharts的源代码是么? <br />期待回答/// <br />对于上SIEVE这个软件,下载了也是用了 ,还有一个 火狐里面可以查看内存的软件,也使用了,但是 但是很头疼, <br />还没有找到解决的办法、 <br />还是经验少啊<br/><strong>问题补充</strong><br/><div class="quote_title">纪红玉 写道</div><div class="quote_div">JavaEye/ItEye <br />1号群 现招人 QQ 群号:39211996 <br />女程序员群7736086 <br />发完帖子我的号就没了,哎! <br /></div> <br />找女程序员群,貌似很难吧,估计你这个也是新创的、<br/><strong>问题补充</strong><br/><div class="quote_title">yintingbird 写道</div><div class="quote_div">我建议你用FusionCharts,你可以在网上搜一下,他的图表显示就很好,我用的就是这个,很简单的,你可以再往上找一个破解版的,但是破解版的柯南找的时候有点不好找。</div> <br />这个项目 已经基本完成了,这时候在动这个技术不太可可能,有可能到最后的时候 换成 SVG + VML了, <br />觉得这个 可以 控制,但是 AJAX 刷新时,内存也是嗖嗖的网上长啊,一秒10几KB 这还只是 小图形。 <br /> <br /> <br />不过应该比当年用DIV时候强吧、、<img src="/images/smiles/icon_cool.gif"/> <br/><strong>问题补充</strong><br/>很奇怪,为什么要投隐呢,难道我发的板块不对 晕、、<br/><strong>问题补充</strong><br/>偷偷的用 到时候 还得改 先拿着个练练手啊!<br/><strong>问题补充</strong><br/><div class="quote_title">conanca 写道</div><div class="quote_div"><div class="quote_title">奥义之舞 写道</div><div class="quote_div"><div class="quote_title">yintingbird 写道</div><div class="quote_div">我建议你用FusionCharts,你可以在网上搜一下,他的图表显示就很好,我用的就是这个,很简单的,你可以再往上找一个破解版的,但是破解版的柯南找的时候有点不好找。</div> <br />这个项目 已经基本完成了,这时候在动这个技术不太可可能,有可能到最后的时候 换成 SVG + VML了, <br />觉得这个 可以 控制,但是 AJAX 刷新时,内存也是嗖嗖的网上长啊,一秒10几KB 这还只是 小图形。 <br /> <br /> <br />不过应该比当年用DIV时候强吧、、<img src="/images/smiles/icon_cool.gif"/> </div> <br /> <br />HighCharts 商业用的话要收费吧。 <br />你们买了授权还是做的是国内项目?</div> <br />先拿这个练手,到时候重新换一个 <br />准备用raphael 谁用过这个,这个性能怎么样呢,封装的SVG+VML<br/><strong>问题补充</strong><br/><div class="quote_title">红四团 写道</div><div class="quote_div">HighCharts所renderer出来的每个Element都是可以destroy的,每个element都有destroy方法。HighCharts封装了VML和SVG,基本上能够跨浏览器。</div> <br />这个还真不知道,只知道总的有个释放的对象,结果一 释放,悲剧的事情发生了,整个图形都没有了<img src="/images/smiles/icon_cry.gif"/> <br /> <br /> <br />另外想知道 highcharts商用要上交多少money啊 <br /><br/><strong>问题补充</strong><br/><div class="quote_title">sunofsummer 写道</div><div class="quote_div">我以前和你遇到过同样的问题,amcharts可以解决。</div> <br />性能方面可以解决么,内存长的快不,和AJAX交互怎么样,<br/><strong>问题补充</strong><br/><div class="quote_title">kiven 写道</div><div class="quote_div">http://www.open-lib.com/Type/164-1.jsp <br /> <br />这里面或许有你要找的。大家都共享一下自己项目用的图标组件吧。</div> <br />thank you <br /> <br /> <br /> <br /> <br /> <br /> <br />不知道who用过Flex么 他生成的swf文件是在客户端生成的,还是服务器生成之后传输过来的呢,如果我要对他进行定时刷新,速度怎么样<br/><strong>问题补充</strong><br/><div class="quote_title">ahzzhen2 写道</div><div class="quote_div">用过Flex as3脚本写过一个监控的,内存占用是用仪表盘形式做的。也试过用pushlet+highchart写过(不是很理想,抛弃)</div> <br />貌似没理解我的意思,我说的是Flex监控 实时刷新 内存部分长的块么, 是在客户端 或者 服务器端绘图,绘制出来的图形传递速度怎么样,占用带宽多么<br/><strong>问题补充</strong><br/><div class="quote_title">sunofsummer 写道</div><div class="quote_div"><div class="quote_title">奥义之舞 写道</div><div class="quote_div"><div class="quote_title">sunofsummer 写道</div><div class="quote_div">我以前和你遇到过同样的问题,amcharts可以解决。</div> <br />性能方面可以解决么,内存长的快不,和AJAX交互怎么样,</div> <br /> <br />amcharts是基于flash实现的 如果网页游戏不存在内存问题的话 它也不会有的。 <br /></div> <br />额 这种的是不是刚开始都要进行加载等待一下啊
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
python学习方法总结(内附python全套学习资料)
不要再问我python好不好学了 我之前做过半年少儿编程老师,一个小学四年级的小孩子都能在我的教学下独立完成python游戏,植物大战僵尸简单版,如果要肯花时间,接下来的网络开发也不是问题,人工智能也可以学个调包也没啥问题。。。。。所以python真的是想学就一定能学会的!!!! --------------------华丽的分割线-------------------------------- ...
兼职程序员一般可以从什么平台接私活?
这个问题我进行了系统性的总结,以下将进行言简意赅的说明和渠道提供,希望对各位小猿/小媛们有帮助~ 根据我们的经验,程序员兼职主要分为三种:兼职职位众包、项目整包和自由职业者驻场。 所谓的兼职职位众包,指的是需求方这边有自有工程师配合,只需要某个职位的工程师开发某个模块的项目。比如开发一个 app,后端接口有人开发,但是缺少 iOS 前端开发工程师,那么他们就会发布一个职位招聘前端,来配合公司一...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
JAVA 基础练习题
第一题 1.查看以下代码,并写出结果 public class Test01 { public static void main(String[] args) { int i1 = 5; boolean result = (i1++ &gt; 5) &amp;&amp; (++i1 &gt; 4); System.out.println(result); Sy...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
C++知识点 —— 整合(持续更新中)
本文记录自己在自学C++过程中不同于C的一些知识点,适合于有C语言基础的同学阅读。如果纰漏,欢迎回复指正 目录 第一部分 基础知识 一、HelloWorld与命名空间 二、引用和引用参数 2.1引用的定义 2.2 将引用用作函数参数 2.3 将引用用于类对象 2.4 引用和继承 2.5 何时使用引用参数 2.6 引用和指针的区别 三、内联函数 四、默认参数的...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
Python实例大全(基于Python3.7.4)
博客说明: 这是自己写的有关python语言的一篇综合博客。 只作为知识广度和编程技巧学习,不过于追究学习深度,点到即止、会用即可。 主要是基础语句,如三大控制语句(顺序、分支、循环),随机数的生成,数据类型的区分和使用; 也会涉及常用的算法和数据结构,以及面试题相关经验; 主体部分是针对python的数据挖掘和数据分析,主要先攻爬虫方向:正则表达式匹配,常用数据清洗办法,scrapy及其他爬虫框架,数据存储方式及其实现; 最后还会粗略涉及人工智能领域,玩转大数据与云计算、进行相关的预测和分析。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
机械转行java自学经历,零基础学java,血泪总结的干货
机械转行java自学经历,零基础学java,血泪总结的干货 据说,再恩爱的夫妻,一生中都有100次想离婚的念头和50次想掐死对方的冲动。 求职路上亦是如此,打开这篇文章,相信你也有转行的想法。和身边的朋友聊过,入职后的他们,或多或少对现在的职位都有些不满,都有过转行的冲动。 可他们只是想,而我真的这样做了。 下面就介绍下我转行的血泪史。 我为什么要转行 高中复读了一年,考了个双非院校的机械。当时...
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
【Linux系统编程】Linux信号列表
00. 目录 文章目录00. 目录01. Linux信号编号02. 信号简介03. 特殊信号04. 附录 01. Linux信号编号 在 Linux 下,每个信号的名字都以字符 SIG 开头,每个信号和一个数字编码相对应,在头文件 signum.h 中,这些信号都被定义为正整数。信号名定义路径:/usr/include/i386-linux-gnu/bits/signum.h 要想查看这些信号和...
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
借助AI力量,谷歌解开生命奥秘?
全文共4484字,预计学习时长8分钟 Paweł Czerwiński发布在 Unsplash上的原图 假如疾病不复存在会发生什么?如果我们能像大自然一样迅速获取能量又会发生什么?要是我们能够在极短时间内循环塑料、废油、或其它的一些物质呢?如果人类能够解开生命的奥秘,那么以上这些想象将在未来成为现实。人工智能企业DeepMind的数据科学分析师日前在此领域有了重大发现。以下为具体内容:...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问