#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()
метод. Пожалуйста, обратитесь к следующему.
Все, что вам нужно сделать, это изменить значения 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);
}
}