Как объект может быть перемещен в новую точку?

#java #canvas

#java #холст

Вопрос:

Этот код рисует круг в рамке

 import java.awt.Canvas;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.Color;

public class Drawing extends Canvas { 

    public static void main(String[] args) {
        JFrame frame = new JFrame("My Drawing");
        Canvas canvas = new Drawing();
        canvas.setSize(400, 400);
        frame.add(canvas);
        frame.pack();
        frame.setVisible(true);
    }

    public void paint(Graphics g) {
        g.fillOval(50, 50, 50, 50);
    }
}
  

Теперь, как его можно переместить в новую точку (например, (100,100))?

Ответ №1:

В Swing вам не нужен холст для рисования фигур. Вы можете расширить JPanel и переопределить его paintComponent() метод. Пожалуйста, обратитесь к следующему.

  1. Рисование в AWT и Swing
  2. Выполнение пользовательского рисования

Все, что вам нужно сделать, это изменить значения x y координат и при вызове метода fillOval() . Вот небольшое приложение, которое демонстрирует.

 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.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Drawing extends JPanel implements ActionListener, Runnable {
    private static final String  MOVE = "Move";

    private int  x;
    private int  y;
    private JFrame  frame;

    public Drawing() {
        x = 10;
        y = 10;
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        String actionCommand = event.getActionCommand();
        switch (actionCommand) {
            case MOVE:
                moveCircle();
                break;
            default:
                JOptionPane.showMessageDialog(frame,
                                              actionCommand,
                                              "Unhandled",
                                              JOptionPane.WARNING_MESSAGE);
        }
    }

    @Override
    public void run() {
        showGui();
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                          RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(Color.BLUE);
        g.fillOval(x, y, 50, 50);
    }

    private JButton createButton(String text, int mnemonic, String tooltip) {
        JButton button = new JButton(text);
        button.setMnemonic(mnemonic);
        button.setToolTipText(tooltip);
        button.addActionListener(this);
        return button;
    }

    private JPanel createButtonsPanel() {
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.add(createButton(MOVE, KeyEvent.VK_M, "Moves circle."));
        return buttonsPanel;
    }

    private JPanel createCanvas() {
        setPreferredSize(new Dimension(400, 400));
        return this;
    }

    private void moveCircle() {
        x = 100;
        y = 100;
        repaint();
    }

    private void showGui() {
        frame = new JFrame("Drawing");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createCanvas(), BorderLayout.CENTER);
        frame.add(createButtonsPanel(), BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Drawing());
    }
}
  

Когда вы запустите приведенный выше код, вы увидите синий круг возле верхнего левого угла окна приложения.

Когда вы нажмете на кнопку Переместить, вы увидите круг, нарисованный в другом месте.

Ответ №2:

Используйте setLocation(Point p) который перемещает компонент в новое местоположение.

В вашем примере:

 import java.awt.*;
import javax.swing.JFrame;

public class Drawing extends Canvas {

    public static void main(String[] args) throws Exception {
        JFrame frame = new JFrame("My Drawing");
        Canvas canvas = new Drawing();
        canvas.setSize(400, 400);
        frame.add(canvas);
        frame.pack();
        frame.setVisible(true);
        Thread.sleep(1000);

        canvas.setLocation(new Point(100,100));

    }

    public void paint(Graphics g) {
        g.fillOval(50, 50, 50, 50);
    }
}