java画直线的代码_键盘画直线疑问

键盘画直线疑问

为什么不能画直线

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class DrawLine extends JFrame implements KeyListener

{

int x=getWidth()/2;

int y=getHeight()/2;

int firstx=getWidth()/2;

int firsty=getHeight()/2;

private Graphics g;

public DrawLine()

{

setFocusable(true);

addKeyListener(this);

}

public static void main(String args[])

{

DrawLine frame=new DrawLine();

frame.setTitle("DrawLine");

frame.setSize(400,300);

frame.setVisible(true);

frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

/*frame.x=frame.getWidth()/2;

frame.y=frame.getHeight()/2;

frame.firstx=frame.getWidth()/2;

frame.firsty=frame.getHeight()/2; */

}

public void keyReleased(KeyEvent e)

{

}

public void keyTyped (KeyEvent e)

{

}

public void keyPressed(KeyEvent e)

{

g=getGraphics();

switch(e.getKeyCode())

{

case KeyEvent.VK_DOWN:y+=10;break;

case KeyEvent.VK_UP:y-=10;break;

case KeyEvent.VK_LEFT:x-=10;break;

case KeyEvent.VK_RIGHT:x+=10;break;

}

g.drawLine(firstx,firsty,x,y);

firstx=x;

firsty=y;

}

}

把int x=getWidth()/2;

int y=getHeight()/2;

int firstx=getWidth()/2;

int firsty=getHeight()/2;

删去,把注释符号删去,使frame.x=frame.getWidth()/2;

frame.y=frame.getHeight()/2;

frame.firstx=frame.getWidth()/2;

frame.firsty=frame.getHeight()/2;能执行

为什么能画直线

KeyPressed方法怎么能调用frame的x ,y, firstx,firsty

搜索更多相关的解决方案:

直线  疑问  键盘

----------------解决方案--------------------------------------------------------

第一个没读懂你的意思。。

第二个KeyPressed方法就在类里面。。。为什么不能调用类的属性、、、

----------------解决方案--------------------------------------------------------

LZ这样写是不对的,应该把作图部分的代码写到方法 protected void paintComponent(Graphics g)中,然后需要重绘的时候调用repaint()方法.

你可以参考一下下面这个代码:

程序代码:

/**

一个用键盘作图的程序

使用'h','j','k','L'件操纵绘图

*/

import java.awt.*;

import java.awt.geom.*;

import java.util.*;

import java.awt.event.*;

import javax.swing.*;

public class Sketch

{

public static void main(String[] args)

{

SketchFrame frame = new SketchFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

/**

A frame with a panel for sketching a figure

*/

class SketchFrame extends JFrame

{

public SketchFrame()

{

setTitle("Sketch");

setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

// add panel to frame

SketchPanel panel = new SketchPanel();

add(panel);

}

public static final int DEFAULT_WIDTH = 300;

public static final int DEFAULT_HEIGHT = 200;

}

/**

A panel for sketching with the keyboard.

*/

class SketchPanel extends JPanel

{

public SketchPanel()

{

last = new Point2D.Double(100, 100);

lines = new ArrayList();

KeyHandler listener = new KeyHandler();

addKeyListener(listener);

setFocusable(true);

}

/**

Add a new line segment to the sketch.

@param dx the movement in x direction

@param dy the movement in y direction

*/

public void add(int dx, int dy)

{

// compute new end point

Point2D end = new Point2D.Double(last.getX() + dx, last.getY() + dy);

// add line segment

Line2D line = new Line2D.Double(last, end);

lines.add(line);

repaint();

// remember new end point

last = end;

}

public void paintComponent(Graphics g)

{

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

// draw all lines

for (Line2D l : lines)

g2.draw(l);

}

private Point2D last;

private ArrayList lines;

private static final int SMALL_INCREMENT = 1;

private static final int LARGE_INCREMENT = 5;

private class KeyHandler implements KeyListener

{

public void keyPressed(KeyEvent event)

{

int keyCode = event.getKeyCode();

// set distance

int d;

if (event.isShiftDown())

d = LARGE_INCREMENT;

else

d = SMALL_INCREMENT;

// add line segment

if (keyCode == KeyEvent.VK_LEFT) add(-d, 0);

else if (keyCode == KeyEvent.VK_RIGHT) add(d, 0);

else if (keyCode == KeyEvent.VK_UP) add(0, -d);

else if (keyCode == KeyEvent.VK_DOWN) add(0, d);

}

public void keyReleased(KeyEvent event) {}

public void keyTyped(KeyEvent event)

{

char keyChar = event.getKeyChar();

// set distance

int d;

if (Character.isUpperCase(keyChar))

{

d = LARGE_INCREMENT;

keyChar = Character.toLowerCase(keyChar);

}

else

d = SMALL_INCREMENT;

// add line segment

if (keyChar == 'h') add(-d, 0);

else if (keyChar == 'l') add(d, 0);

else if (keyChar == 'k') add(0, -d);

else if (keyChar == 'j') add(0, d);

}

}

}

----------------解决方案--------------------------------------------------------

sorry,能分段画直线,但为什么一开始

int x=getWidth()/2;

int y=getHeight()/2;

int firstx=getWidth()/2;

int firsty=getHeight()/2;

x,y,firstx,firsty都为0;不为panel的宽,高的一半

----------------解决方案--------------------------------------------------------

JFrame默认宽,高是0,0.。位置0,0.。

----------------解决方案--------------------------------------------------------

不错有意思!!!

----------------解决方案--------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值