繁体   English   中英

如何将对象形状从一个位置移动到另一位置?

[英]How would I move an object shape from one location to another?

我正在尝试将一个蓝色圆圈的对象从一个位置移动到另一个位置。 这将在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);
        }
    }
    for (int k=50; k<=350; k+=100){
        for (int l=50; l<=350; l+=100){
            gBoard.clearRect(k,l,50,50);
        }
    }

上面的代码显示我已经成功创建了8 * 8网格,这意味着我可以将对象放置在需要放置的位置。

    gBoard.setColor(Color.BLUE);
    int x = 0;
    int y = 0;
    gBoard.fillOval(x,y,50,50);

上面的代码显示了我已将该对象放入网格中,但是这将进入public void方法,还是将其作为一种单独的方法,因为该对象将不会处于恒定位置。 该对象将不断移动。 public void是否更合适,还是最好对接口使用单独的方法?

意见建议:

  • 使用GridLayout创建添加到JPanel的JLabel网格
  • 使用带有Icon的JLabel的构造函数,为每个JLabel提供适当大小的空ImageIcon。
  • 还创建另一个保存彩色磁盘的ImageIcon
  • 通过在该JLabel上调用setIcon(...)将图标移至相应的JLabel
  • 通过调用setIcon(...)并传入空或空白图标,从JLabel中删除图标。

例如,

在此处输入图片说明

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());
    }
}

选项2-如果您希望磁盘有更多自由形式的运动,则:

  • 向JPanel本身添加MouseListener和MouseMotionListener
  • 在此组合侦听器中(两个都使用MouseAdapter),更改两个int字段(例如centerX和centerY)持有的值,并调用repaint();
  • 覆盖paintComponent方法,注意在您的覆盖中调用super的方法
  • 在替代中,将磁盘绘制在鼠标侦听器更改的字段所指定的位置。

例如:

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());
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM