当前位置: 首页 > 面试题库 >

Java如何在鼠标单击上绘制矩形

仉明知
2023-03-14
问题内容

如标题所示,我很难在JApplet中绘制一些矩形(填充的)。确切的目标是拥有一张50x50的表格,并在您
点击目标单元格时将其填充(可以通过绘制一个填充的矩形来完成)。我已经完成了有关起点坐标的数学运算,
但是由于某些原因,我无法在MouseClicked方法中绘制新矩形。有什么建议?

public class Main extends JApplet {

public static final int DIMX = 800;
public static final int DIMY = 800;
public static final int ratio = 16;
Graphics g;
boolean drawing;
public int cX;
public int cY;

public Main() {
    JPanel MainFrame = new JPanel();
    MainFrame.setPreferredSize(new Dimension(400, 800));
    MainFrame.setBackground(Color.LIGHT_GRAY);
    JPanel Table = new JPanel();
    Table.setPreferredSize(new Dimension(800, 800));
    Table.setBackground(Color.LIGHT_GRAY);
    add(MainFrame, BorderLayout.EAST);
    add(Table, BorderLayout.WEST);
    addMouseListener(new clicked());
}



public void paint(Graphics g) {
    super.paintComponents(g);
    g.setColor(Color.black);
    for (int i = 0; i <= 800; i += 16) {
        g.drawLine(0, i, 800, i);
        g.drawLine(i, 0, i, 800);
//            g.fillRect(cX, cY, 16, 16);
    }
}

public static void main(String[] args) {
    JFrame win = new JFrame("Retarded Bullshit");
    win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    win.setPreferredSize(new Dimension(1216, 840));
    win.setContentPane(new Main());
    win.pack();
    win.setVisible(true);

}

public class clicked extends JApplet implements MouseListener {

public int cX;
public int cY;
Graphics g;

@Override
public void mouseClicked(MouseEvent e) {
//            Point a = e.getLocationOnScreen();
    int cellX = e.getX();
    int cellY = e.getY();
    if (cellX < 800 && cellX > 0 && cellY < 800 && cellY > 0) {
        cX = cellX / 16 + 1;
        cY = cellY / 16 + 1;

        JOptionPane.showMessageDialog(null, "" + cX + " " + cY);
    }

问题答案:

这是一个相对简单的概念(没有冒犯性)。

首先,请勿将代码与JApplet和混合使用JFrame。如果您想在这两种媒介中使用您的应用程序,请将逻辑分成一个单独的
组件(如JPanel),您可以轻松地将其添加到其中。您真的不应该将顶级容器添加到另一个顶级容器(在框架中添加小程序)-太麻烦了。

请避免改写paint顶层容器的方法(如JApplet),而改用自定义组件(如JPanel)并改写它的paintComponent方法。

在您的示例中,您应该打电话super.paint而不是super.paintComponents。paint做重要的工作,您不想跳过
它-但您应该使用JComponent#paintComponent

MouseListener应当添加到您对管理鼠标事件感兴趣的组件中。因为clicked从不添加到任何容器,所以
它将永远不会收到鼠标事件。

Take a look at

  • How to write mouse listeners
  • Performing Custom Painting
  • 2D Graphics
  • Painting in AWT and Swing (because every Swing developer should have an understanding of this)

enter image description here

public class SimplePaint03 {

    public static void main(String[] args) {
        new SimplePaint03();
    }

    public SimplePaint03() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new PaintPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintPane extends JPanel {

        private List<Shape> grid;
        private List<Shape> fill;

        public PaintPane() {
            grid = new ArrayList<>(5);
            fill = new ArrayList<>(5);
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    for (Shape shape : grid) {
                        if (shape.contains(e.getPoint())) {
                            if (fill.contains(shape)) {
                                fill.remove(shape);
                            } else {
                                fill.add(shape);
                            }
                        }
                    }
                    repaint();
                }
            });

            int colWidth = 200 / 50;
            int rowHeight = 200 / 50;

            for (int row = 0; row < 50; row++) {
                for (int col = 0; col < 50; col++) {
                    grid.add(new Rectangle(colWidth * col, rowHeight * row, colWidth, rowHeight));
                }
            }

        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(Color.RED);
            for (Shape cell : fill) {
                g2d.fill(cell);
            }
            g2d.setColor(Color.BLACK);
            for (Shape cell : grid) {
                g2d.draw(cell);
            }
        }

    }

}

Additional

Information from one paint cycle to another is not maintained. You are
required to repaint the component exactly the way you want it to appear. This
means you will need to maintain a list of click points that can be repainted
at any time.



 类似资料:
  • 我正在尝试创建一个程序,该程序应该基于两次鼠标左键单击在画布上绘制一个矩形,并通过一次右键单击清除画布。 创建矩形的方式应该是,第一次鼠标点击模拟矩形的一个角,下一次鼠标点击与第一次鼠标点击相比模拟矩形的对角线角。 我被困在如何存储第一次鼠标点击的坐标,然后把第二次鼠标点击用好,因为每个定义的矩形只基于一组坐标创建,这是矩形的左上角。 现在,我的代码所做的只是绘制固定大小的矩形(50x25),这显

  • 问题内容: 我只想在鼠标单击后绘制圆圈。由于paintComponent方法调用了自身,因此首先绘制圆而无需单击。 问题答案: 您的代码存在一些问题: 你永远不会打电话 你只需要一个和 请注意,当您调整框架大小时,某些圆圈将消失,并且总体上以奇怪的方式表现。 我会将所有s 存储在用户单击的位置,然后在方法内部遍历该列表。这样您就可以通话,而圈子不会消失。 更改后的工作代码:

  • 问题内容: 我正在使用Java。我想根据mousedrag事件绘制矩形。如果用户拖动鼠标,则小程序上的矩形应根据当前鼠标坐标增加或减少。我有以下代码。 在下面的代码中,我使用[b] SelectionArea [/ b]类扩展了在其上执行绘制操作的画布。我在此类中使用[b] image [/ b]变量进行双缓冲,以减少闪烁并保存小程序的先前状态(即,绘制小程序的内容) 但如果我画第一个矩形,代码工

  • 在HTML和JavaScript中,这应该是一个非常简单的任务。我有一个图标栏,目前有一个单一的可点击链接,新的框。在图标栏下面,我有一张画布。我的目标是在用户每次按下new Box按钮时,在画布上绘制一个新的矩形。 现在,我的图标栏和画布正确显示,我可以单击图标栏的“新建框”链接,但画布上没有出现矩形,尽管我已将其参数指定为:。 null null

  • 问题内容: 我的程序可以绘制矩形。我有两个无法解决的问题。在绘制矩形后,它将不再停留。我拥有的唯一代码可以清除绘画中的画布,仅在鼠标拖动时才需要重画。为什么当我释放鼠标或移动鼠标时,画布会清除。第二件事不是什么大问题,但是我不知道,当矩形的高度或宽度为负数时,矩形将用黑色填充。 问题答案: 好吧,在重新阅读您的问题后,似乎您不必担心拥有多个矩形:) 这是一次只能解决一个问题的解决方案(与您开始时的

  • 我是WPF的新手。 我想在Canvas上的鼠标移动事件上画一个圆圈。我已经编写了在画布上拖动它的逻辑。但是我想在鼠标点击我的画布时创建一个圆圈,它应该根据鼠标在画布上的移动来调整大小。 我怎样才能做到这一点? 这是我的代码