java - 如何在按键java swing上旋转一条线

标签 java swing graphics rotation line

我想知道任何人都可以帮助我使用旋转方法,我查看了以前的问题并没有找到我要找的东西..

代码已经被压缩,所以一些元素可能会丢失.. 屏幕截图如下。

我目前在要旋转的行变量中加减 10 谁能帮我使用实际的旋转方法,,

提前致谢..

公共(public)类 Display 扩展 JFrame{

private int Lx1 = CANVAS_WIDTH / 2;         private int Mx1 = CANVAS_WIDTH / 2;
private int Ly1 = CANVAS_HEIGHT / 2;        private int My1 = CANVAS_HEIGHT / 2;
private int Lx2 = CANVAS_WIDTH / 2;         private int Mx2 = CANVAS_WIDTH / 2;
private int Ly2 = CANVAS_HEIGHT / 2;        private int My2 = CANVAS_HEIGHT;



public Display() {
    canvas = new DrawCanvas();
    canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
    canvas.setLayout(new GridLayout(8, 4, 80, 10));
    canvas.setComponentOrientation(ComponentOrientation.UNKNOWN);
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());

Altitude = new JTextField("Altitude", 5);               Altitude.setHorizontalAlignment(JTextField.CENTER);
Altitude.setEditable(false);                            Altitude.setOpaque(false);
Altitude.setFont(Altitude.getFont().deriveFont(25f));           Altitude.setForeground(Color.WHITE);

TASpeed = new JTextField("TAs", 5);                         TASpeed.setHorizontalAlignment(JTextField.CENTER);
TASpeed.setEditable(false);                                 TASpeed.setOpaque(false);
TASpeed.setFont(TASpeed.getFont().deriveFont(25f));             TASpeed.setForeground(Color.WHITE);

TargetAlt = new JTextField("Taralt", 5);                    TargetAlt.setHorizontalAlignment(JTextField.CENTER);
TargetAlt.setEditable(false);                               TargetAlt.setOpaque(false);
TargetAlt.setFont(TargetAlt.getFont().deriveFont(25f));         TargetAlt.setForeground(Color.WHITE);

TargetSpeed = new JTextField("TArsp", 5);                   TargetSpeed.setHorizontalAlignment(JTextField.CENTER);
TargetSpeed.setEditable(false);                             TargetSpeed.setOpaque(false);
TargetSpeed.setFont(TASpeed.getFont().deriveFont(25f));         TargetSpeed.setForeground(Color.WHITE);

BaroCorrectUp =  new JTextField("BaroCorU", 5);             BaroCorrectUp.setHorizontalAlignment(JTextField.CENTER);
BaroCorrectUp.setEditable(false);                           BaroCorrectUp.setOpaque(false);
BaroCorrectUp.setFont(BaroCorrectUp.getFont().deriveFont(25f));     BaroCorrectUp.setForeground(Color.WHITE);

BaroCorrectDown =  new JTextField("BaroCorD", 5);           BaroCorrectDown.setHorizontalAlignment(JTextField.CENTER);
BaroCorrectDown.setEditable(false);                         BaroCorrectDown.setOpaque(false);
BaroCorrectDown.setFont(BaroCorrectUp.getFont().deriveFont(25f));   BaroCorrectDown.setForeground(Color.WHITE);

WindDir = new JTextField("Wind dir", 5);                    WindDir.setHorizontalAlignment(JTextField.CENTER);
WindDir.setEditable(false);                                 WindDir.setOpaque(false);
WindDir.setFont(WindDir.getFont().deriveFont(25f));             WindDir.setForeground(Color.WHITE);

EquivSpeed = new JTextField("EquivSpe", 5);             EquivSpeed.setHorizontalAlignment(JTextField.CENTER);



addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent evt) {
            switch(evt.getKeyCode()) {
            case KeyEvent.VK_LEFT:
                Rx1 -= 10;      Ry1 += 10;          Rx2 += 10;      Ry2 -= 10;
                x1 -=10;        x2 +=10;            Mx1 += 10;      Mx2 -= 10;      

                repaint();
                break;
            case KeyEvent.VK_RIGHT:
                Rx1 -= 10;      Ry1 -= 10;          Rx2 += 10;      Ry2 += 10;
                x1 += 10;       x2 += 10;           Mx1 -= 10;      Mx2 += 10;      


                repaint();
                break;
            case KeyEvent.VK_DOWN:
                y1 -= 10;       y2 -= 10;           Ly1 -= 10;      Ly2 -= 10;
                Sy1 += 10;      Sy2 -= 10;          Ry1 +=10;       Ry2 += 10;
                repaint();
                break;
            case KeyEvent.VK_UP:
                y1 += 10;       y2 += 10;           Ly1 += 10;      Ly2 += 10;
                Sy1 -= 10;      Sy2 += 10;          Ry1 -= 10;      Ry2 -= 10;
                repaint();
                break;
            case KeyEvent.VK_M:
                System.exit(0);
                break;
            case KeyEvent.VK_4:
                countAd++;
                BaroCorrectDown.setText(countAd + "");
                repaint();
                break;
            case KeyEvent.VK_3:
                countAu++;
                BaroCorrectUp.setText(countAu + "");
                repaint();
                break;
            }
        }
    });
    cp.add(canvas);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(CANVAS_WIDTH / 3, CANVAS_HEIGHT / 4, CANVAS_WIDTH, CANVAS_HEIGHT);
    setTitle("FLIGHT DISPLAY");                         pack();
    setVisible(true);                                   requestFocus();
}

class DrawCanvas extends JPanel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        setBackground(CANVAS_BACKGROUND);
        g.setColor(GROUND_COLOR);
        //Draw ground Color
        g.drawRect(Sx1 - Sx1,Sy1 /2, CANVAS_WIDTH, Sy2 /2);
        g.fillRect(Sx1 - Sx1, Sy1 /2, CANVAS_WIDTH, Sy2 /2);

        g.setColor(LINE_COLOR);
        //Draw line centre horizontal
        g.drawLine(Rx1, Ry1 /2, Rx2, Ry2 /2);

        g.drawOval(x1 -15, y1 -15, 30, 30);


        //Draw line dim

        g.setColor(Color.YELLOW);
        g.fillArc(CANVAS_WIDTH /2 -150, 10, 300, 170, 30, 120);
        g.setColor(LINE_COLOR);

        //Draw polyline centre plane
        g.setColor(Color.YELLOW);
        g.drawPolyline(xs, ys, 10);
        g.fillPolygon(new Polygon(
                 new int[]{470, 350, 230, 350, 470},
                 new int[]{260, 205, 260, 225, 260},5));

        g.setColor(Color.CYAN);
        g.setColor(Color.BLACK);
        g.drawArc(CANVAS_WIDTH / 2 -150, 10, 300, 170,  30, 120);
        g.drawArc(CANVAS_WIDTH / 2 -150, 11, 300, 170,  30, 120);
        g.setColor(CANVAS_BACKGROUND);
        g.fillRect(0, 60, CANVAS_WIDTH, 50);
        Color DarkTRANS = new Color(0.0f, 0.0f, 0.0f, 1.0f);
        g.setColor(DarkTRANS);
        g.fillRect(0, 400, CANVAS_WIDTH, 50);
        g.fillRect(0, 345, 115, 55);
        g.fillRect(585, 345, 115, 55);
        g.setColor(LINE_COLOR);
        g.drawLine(Lx1 -50, Ly1 -120, Lx2 +50, Ly2 -120);
        g.drawLine(Lx1 -25, Ly1 -140, Lx2 +25, Ly2 -140);
        g.drawLine(Lx1 -75, Ly1 -160, Lx2 +75, Ly2 -160);
        g.drawLine(Lx1 -25, Ly1 +20, Lx2 +25, Ly2 +20);
        g.drawLine(Lx1 -50, Ly1 +40, Lx2 +50, Ly2 +40);
        g.drawLine(Lx1 -25, Ly1 +60, Lx2 +25, Ly2 +60);
        g.drawLine(Lx1 -75, Ly1 +80, Lx2 +75, Ly2 +80);
        g.drawLine(Lx1 -25, Ly1 +100, Lx2 +25, Ly2 +100);
        g.drawLine(Lx1 -50, Ly1 +120, Lx2 +50, Ly2 +120);
        //Draw line dim
        g.drawLine(Lx1 -25, Ly1 -20, Lx2 +25, Ly2 -20);
        g.drawLine(Lx1 -50, Ly1 -40, Lx2 +50, Ly2 -40);
        g.drawLine(Lx1 -25, Ly1 -60, Lx2 +25, Ly2 -60);
        g.drawLine(Lx1 -75, Ly1 -80, Lx2 +75, Ly2 -80);
        g.drawLine(Lx1 -25, Ly1 -100, Lx2 +25, Ly2 -100);

        //bottom triangles
        g.setColor(DarkTRANS);
        g.fillPolygon(new Polygon(
                 new int[]{115, 115, 200},
                 new int[]{400, 345, 400},3));
        g.fillPolygon(new Polygon(
                 new int[]{585, 585, 500},
                 new int[]{400, 345, 400},3));
        //top button triangle/shapes
        g.fillPolygon(new Polygon(
                new int[]{0, 200, 115, 0,},
                new int[]{0, 0, 50, 50},4));
        g.fillPolygon(new Polygon(
                new int[]{500, 700, 700, 585,},
                new int[]{0, 0, 50, 50},4));
        //middle button shapes
        g.fillPolygon(new Polygon(
                new int[]{0, 100, 100, 117, 117, 130, 117, 117, 100, 100, 0},
                new int[]{174, 174, 159, 159, 187, 197, 207, 235, 235, 220, 220},11));
                //right hand shape
        g.fillPolygon(new Polygon(
                new int[]{700, 600, 600, 583, 583, 570, 583, 583, 600, 600, 700},
                new int[]{174, 174, 159, 159, 187, 197, 207, 235, 235, 220, 220},11));
        Color TRANS = new Color(0.0f, 0.0f, 0.0f, 0.35f);
        g.setColor(TRANS);
        g.fillRect(0, 0, 115, CANVAS_HEIGHT);
        g.fillRect(585, 0, 115, CANVAS_HEIGHT);

        g.setColor(LINE_COLOR);
        g.drawLine(Mx1+20, My1 + My1, Mx2, My2-440);
        g.drawLine(Mx1-20, My1 + My1, Mx2, My2-440);
        g.drawLine(Mx1, My1 + My1, Mx2, My2-440);

        g.drawString("10", Lx1 -90, Ly1 -75);
        g.drawString("10", Lx1 +77, Ly1 -75);
        g.drawString("10", Lx1 -90, Ly1 +85);
        g.drawString("10", Lx1 +77, Ly1 +85);
        g.drawString("20", Lx1 +77, Ly1 -155);
        g.drawString("20", Lx1 -90, Ly1 -155);


        g.drawString("Press alt + 3(U), 4(D)\n" , 582, 305);
        g.drawString("To Initialize" , 595, 315);
    }
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Display();
        }
    });
}

} enter image description here

最佳答案

LinePanel 的变体可能会建议一种方法。

image

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

/**
 * @see https://stackoverflow.com/a/15027637/230513
 * @see https://stackoverflow.com/questions/6991648
 * @see https://stackoverflow.com/questions/6887296
 * @see https://stackoverflow.com/a/5797965/230513
 */
public class LinePanel extends JPanel {

    private Point p1 = new Point(320, 100);
    private Point p2 = new Point(320, 380);
    private boolean drawing;

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

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.blue);
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(8,
            BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
        g.drawLine(p1.x, p1.y, p2.x, p2.y);
    }

    private class ControlPanel extends JPanel {

        private static final int DELTA = 10;

        public ControlPanel() {
            this.add(new MoveButton("\u21BA", KeyEvent.VK_LEFT, DELTA, 0));
            this.add(new MoveButton("\u21BB", KeyEvent.VK_RIGHT, -DELTA, 0));
        }

        private class MoveButton extends JButton {

            KeyStroke k;
            int dx, dy;

            public MoveButton(String name, int code, final int dx, final int dy) {
                super(name);
                this.k = KeyStroke.getKeyStroke(code, 0);
                this.dx = dx;
                this.dy = dy;
                this.setAction(new AbstractAction(this.getText()) {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        LinePanel.this.p1.translate(-dx, 0);
                        LinePanel.this.p2.translate(dx, 0);
                        LinePanel.this.repaint();
                    }
                });
                ControlPanel.this.getInputMap(
                    WHEN_IN_FOCUSED_WINDOW).put(k, k.toString());
                ControlPanel.this.getActionMap().put(k.toString(), new AbstractAction() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        MoveButton.this.doClick();
                    }
                });
            }
        }
    }

    private void display() {
        JFrame f = new JFrame("LinePanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.add(new ControlPanel(), BorderLayout.SOUTH);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new LinePanel().display();
            }
        });
    }
}

关于java - 如何在按键java swing上旋转一条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15008761/

相关文章:

java - 检查两个整数是否在 0 的同一侧的最快方法

java - MQTT Android Studio 和 Raspberry PI 代理

java - 将 jCombobox 按钮移至左侧

java - 将自定义 View 添加到 xml 布局

java - 在java中旋转图像

java - 获取字符串中非唯一单词的边界索引

java - 滥用 Optional#map 考虑缺少 Optional#peek 方法

java - 具有两个 toString 方法的自定义 JCombobox 模型

java swing jtable 单元格渲染器组件的屏幕位置

java - java中图形对象居中