Java 如何将对象形状从一个位置移动到另一个位置?
我试着将一个物体从一个位置移动到另一个位置,在这个例子中是一个蓝色的圆圈。这将是一个8*8的网格Java 如何将对象形状从一个位置移动到另一个位置?,java,swing,oop,awt,2d,Java,Swing,Oop,Awt,2d,我试着将一个物体从一个位置移动到另一个位置,在这个例子中是一个蓝色的圆圈。这将是一个8*8的网格 gBoard.setColor(Color.LIGHT_GRAY); gBoard.fillRect(0,0,400,400); for (int k=000; k<=300; k+=100){ for (int l=000; l<=300; l+=100){ gBoard.clearRect(k,l,50,50);
gBoard.setColor(Color.LIGHT_GRAY);
gBoard.fillRect(0,0,400,400);
for (int k=000; k<=300; k+=100){
for (int l=000; l<=300; l+=100){
gBoard.clearRect(k,l,50,50);
}
}
for (int k=50; k<=350; k+=100){
for (int l=50; l<=350; l+=100){
gBoard.clearRect(k,l,50,50);
}
}
上面的代码显示我已将对象放入网格中,但是这将进入public void
方法,或者这是一个单独的方法,因为对象不会位于固定位置。物体会不断移动。public void
更合适还是最好为界面使用单独的方法?建议:
- 使用GridLayout创建添加到JPanel的JLabel网格
- 为每个JLabel提供一个大小合适的空ImageIcon,并使用JLabel的构造函数获取一个图标
- 还可以创建另一个保存彩色磁盘的ImageIcon
- 通过调用该JLabel上的
将图标移动到相应的JLabelsetIcon(…)
- 通过调用
并传入空图标或空白图标,从JLabel中删除图标setIcon(…)
- 使用GridLayout创建添加到JPanel的JLabel网格
- 为每个JLabel提供一个大小合适的空ImageIcon,并使用JLabel的构造函数获取一个图标
- 还可以创建另一个保存彩色磁盘的ImageIcon
- 通过调用该JLabel上的
将图标移动到相应的JLabelsetIcon(…)
- 通过调用
并传入空图标或空白图标,从JLabel中删除图标setIcon(…)
我将简化--创建一个大小合适的8x8 JLabel网格,并通过其
setIcon(…)
方法简单地设置JLabel的图标。然后将我的ImageIcon添加到该JLabel中,并通过将null
传递到该方法中将其从另一个JLabel中删除。要使用JLabel,我必须导入另一个java元素或javax.swing.*和java.awt.*是令人满意的另一种简化方法:声明一个Shape
类,该类封装了位置(x,y)的概念以及可以在gBoard
或Graphics
上绘制的形状。不要以任何形式使用import*
,请显式导入类<代码>导入javax.swing.JLabel代码>我将简化--创建一个大小合适的8x8 JLabel网格,并通过其setIcon(…)
方法简单地设置JLabel的图标。然后将我的ImageIcon添加到该JLabel中,并通过将null
传递到该方法中将其从另一个JLabel中删除。要使用JLabel,我必须导入另一个java元素或javax.swing.*和java.awt.*是令人满意的另一种简化方法:声明一个Shape
类,该类封装了位置(x,y)的概念以及可以在gBoard
或Graphics
上绘制的形状。不要以任何形式使用import*
,请显式导入类<代码>导入javax.swing.JLabel代码>
gBoard.setColor(Color.BLUE);
int x = 0;
int y = 0;
gBoard.fillOval(x,y,50,50);
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class ColoredOvals extends JPanel {
public static final int CELL_WIDTH = 50;
public static final int SIDE = 8;
private JLabel[][] grid = new JLabel[SIDE][SIDE];
private Icon emptyIcon;
private Icon colorIcon;
public ColoredOvals() {
// so lines appear between cells
setBackground(Color.BLACK);
// empty icon is 50x50 in size, and with clear color
emptyIcon = createIcon(new Color(0, 0, 0, 0));
// icon with a RED disk
colorIcon = createIcon(Color.RED);
// create a grid layout to hold the JLabels
// the 1, 1 is for the empty space between cells to show the black line
setLayout(new GridLayout(SIDE, SIDE, 1, 1));
// line around the entire JPanel (if desired)
setBorder(BorderFactory.createLineBorder(Color.BLACK));
// mouse listener that moves the icon to the selected cell:
MouseListener mouseListener = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
clearGrid(); // all labels hold blank icon
JLabel label = (JLabel) e.getSource();
label.setIcon(colorIcon); // selected JLabel holds disk
}
};
// iterate through the grid 2D array, creating JLabels and adding
// blank icon as well as a MouseListener
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
grid[i][j] = new JLabel(emptyIcon); // blank icon
grid[i][j].setOpaque(true);
grid[i][j].setBackground(Color.WHITE);
add(grid[i][j]);
grid[i][j].addMouseListener(mouseListener);
}
}
}
public void clearGrid() {
for (JLabel[] jLabels : grid) {
for (JLabel jLabel : jLabels) {
jLabel.setIcon(emptyIcon);
}
}
}
// code to create blank icon or disk icon of color of choice
private Icon createIcon(Color color) {
BufferedImage img = new BufferedImage(CELL_WIDTH, CELL_WIDTH, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(color);
int gap = 2;
g2.fillOval(gap, gap, CELL_WIDTH - 2 * gap, CELL_WIDTH - 2 * gap);
g2.dispose();
return new ImageIcon(img);
}
private static void createAndShowGui() {
ColoredOvals mainPanel = new ColoredOvals();
JFrame frame = new JFrame("ColoredOvals");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class ColoredOvals2 extends JPanel {
public static final int CELL_WIDTH = 50;
public static final int SIDE = 8;
private static final Color BG = Color.WHITE;
private static final Color DISK_COLOR = Color.BLUE;
private int centerX = 0;
private int centerY = 0;
public ColoredOvals2() {
setBackground(BG);
MouseAdapter myMouse = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
moveDisk(e);
}
@Override
public void mouseDragged(MouseEvent e) {
moveDisk(e);
}
private void moveDisk(MouseEvent e) {
centerX = e.getX();
centerY = e.getY();
repaint();
}
};
addMouseListener(myMouse);
addMouseMotionListener(myMouse);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
int w = SIDE * CELL_WIDTH;
int h = w;
return new Dimension(w, h);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(DISK_COLOR);
int x = centerX - CELL_WIDTH / 2;
int y = centerY - CELL_WIDTH / 2;
int w = CELL_WIDTH;
int h = CELL_WIDTH;
g2.fillOval(x, y, w, h);
}
private static void createAndShowGui() {
ColoredOvals2 mainPanel = new ColoredOvals2();
JFrame frame = new JFrame("ColoredOvals2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}