在Java中通过KeyTyped事件绘制两行

时间:2015-11-12 04:44:23

标签: java swing keylistener paintcomponent

嗨我想在键盘上按h和v在面板中绘制水平和垂直轴。我不知道怎么...这是我的代码。如何控制Keytyped事件

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
import java.awt.geom.Line2D;

@SuppressWarnings("serial")
public class DrawAxis extends JPanel implements KeyListener
{   
private Graphics2D g2;
private float x1;
private float y1;
private float x2;
private float y2;

public void DrawingAxis(float X1,float Y1,float X2,float Y2)
{
    x1=X1;
    y1=Y1;
    x2=X2;
    y2=Y2;
}

public void paint(Graphics g)
{
    super.paintComponent(g);
    g2=(Graphics2D) g;
    g2.setColor(Color.GRAY);
    g2.setStroke(new BasicStroke(1));
    g2.draw(new Line2D.Float(x1,y1,x2,y2));
}

@Override
public void keyPressed(KeyEvent event) {

}

@Override
public void keyReleased(KeyEvent event) {

}

@Override
public void keyTyped(KeyEvent event) {
    char ch=event.getKeyChar();
    switch(ch) 
    {
    case 'h':
        //????????
    case 'v':
        //????????
    }
}
}

这是主要代码:

import javax.swing.JFrame;

public class Example1
{
public static void main(String[] args) {
    JFrame frame=new JFrame("Drawing line");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(1000,1000);
    DrawAxis dshape=new DrawAxis();
    dshape.DrawingAxis(500,0,500,1000);
    dshape.DrawingAxis(0,500,1000,500);
    dshape.setFocusable(true);
    dshape.addKeyListener(dshape);
    frame.add(dshape);
    frame.setVisible(true);

}

}

我该如何填写此代码?

1 个答案:

答案 0 :(得分:1)

首先使用KeyListener上的密钥绑定API,它将解决与KeyListener相关的一些关键问题。有关详细信息,请参阅How to Use Key Bindings

您只需在数组中存储一系列点或List并使用Graphics#drawLine在它们之间绘制线条,或者您可以利用Graphics 2D的形状API。有关详细信息,请参阅2D Graphics

EtchaSketch

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.geom.Path2D;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DrawLine {

    public static void main(String[] args) {
        new DrawLine();
    }

    public DrawLine() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Point currentPoint;
        private Path2D shape;

        public TestPane() {
            currentPoint = new Point(0, 0);
            shape = new Path2D.Double();
            shape.moveTo(0, 0);

            bindKey(KeyEvent.VK_H, "draw.horizontally", new AddPointAction(4, 0));
            bindKey(KeyEvent.VK_V, "draw.vertically", new AddPointAction(0, 4));
        }

        protected void bindKey(int vkKey, String name, Action action) {
            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = getActionMap();

            im.put(KeyStroke.getKeyStroke(vkKey, 0), name);
            am.put(name, action);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.draw(shape);
            g2d.dispose();
        }

        public class AddPointAction extends AbstractAction {

            private int xDelta;
            private int yDelta;

            public AddPointAction(int xDelta, int yDelta) {
                this.xDelta = xDelta;
                this.yDelta = yDelta;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                int x = currentPoint.x + xDelta;
                int y = currentPoint.y + yDelta;
                shape.lineTo(x, y);
                currentPoint.x = x;
                currentPoint.y = y;
                repaint();
            }

        }

    }

}