尝试单击按钮以在JPanel中添加动态定位的图像

尝试单击按钮以在JPanel中添加动态定位的图像

本文介绍了尝试单击按钮以在JPanel中添加动态定位的图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试向现有的JPanel添加/绘制单个Graphics对象.我正在生成10个初始Graphics对象,它们的大小和放置在面板中的大小都是随机的,但我想一次添加一次其他绘制的对象,它们的大小和位置都像初始的10个一样.

当前,AddNewDrawItem类未呈现新的Graphics对象.

谢谢您的输入.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class Painter{

private DrawingPanel dp = new DrawingPanel();

    //constructor
    public Painter(){
        buildGUI();
    }

    private void buildGUI(){
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.setTitle("Paint drawing demonstration");
        JPanel headerPanel = new JPanel();
        headerPanel.add(new JLabel("The drawing panel is below"));
        JButton addNew = new JButton("Add New Graphic");
        addNew.addActionListener(new addNewClickHandler());
        headerPanel.add(addNew);
        frame.add(BorderLayout.NORTH,headerPanel);
        frame.add(BorderLayout.SOUTH,this.dp);
        frame.pack();
        frame.setVisible(true);
    }

    class DrawingPanel extends JPanel {

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            this.setBackground(Color.white);

            int x, posx, posy, width, height;

            for(x=0;x<=10;x++){
                //even number differentiation
                if(x % 2 == 0){
                    g.setColor(Color.red);
                }else{
                    g.setColor(Color.blue);
                }

                Random rand = new Random();
                posx = rand.nextInt(300);
                posy = rand.nextInt(300);
                width = rand.nextInt(40);
                height = rand.nextInt(40);

                //System.out.println("the ran x pos is: " + posx);
                g.fillRect(posx, posy, width, height);
            }//end for
         }//end paintComponent

        public Dimension getPreferredSize() {
           return new Dimension(400,400);
        }
    }// end DrawingPanel

    private class addNewClickHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            System.out.print("in addNew_click_handler click handler");//trace debug
            AddNewDrawItem newItem = new AddNewDrawItem();
            newItem.repaint();
            System.out.print("after repaint() in addNew_click_handler click  handler");//trace debug
            }
        }

    class AddNewDrawItem extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            this.setBackground(Color.white);
            int posx, posy, width, height;

            Random rand = new Random();
            posx = rand.nextInt(300);
            posy = rand.nextInt(300);
            width = rand.nextInt(40);
            height = rand.nextInt(40);
            g.setColor(Color.cyan);
            g.fillRect(posx, posy, width, height);

        }//end paintComponent
    }//end AddNewDrawItem

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

    }//end class Painter
解决方案

您的代码存在一些问题,其中之一是您的paintComponent方法中存在程序逻辑:代码会随机更改以下值:在此方法中显示,表示无论您是否要重新显示,您的显示都会改变.要看到是这样,请尝试调整您的GUI的大小,您将在绘制的红色和蓝色矩形中看到一些迷幻的变化.

关于您当前的问题,现在的解决方案类似于我上面描述的问题的解决方案.我建议...

  • 您创建了ArrayList<Rectangle2D>
  • 您可以在类的构造函数中创建随机矩形,以便仅创建一次,然后将其放置在上面的ArrayList中.
  • 您在JPanel的paintComponent方法中循环访问此ArrayList,并在进行时绘制它们.这样,paintComponent只会执行应有的绘画,
  • 您创建一个MouseAdapter派生的对象,并将其作为MouseListener和MouseMotionListener添加到您的DrawingPanel中
  • 您使用上面的侦听器创建了一个新的Rectangle2D对象,完成后将其添加到ArrayList并在DrawingPanel上调用repaint
  • 您通过按钮的动作监听器激活鼠标适配器.

我会停在这里,但我想您会明白的,如果您不明白,请提出任何可能的问题.

I am trying to add/draw a single Graphics object to an existing JPanel. I am generating 10 initial Graphics objects randomly sized and place in the panel, but would like to add additional drawn objects one a time, randomly sized and placed like the initial 10.

Currently, the AddNewDrawItem class is not rendering the new Graphics object.

Thank you for input.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class Painter{

private DrawingPanel dp = new DrawingPanel();

    //constructor
    public Painter(){
        buildGUI();
    }

    private void buildGUI(){
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.setTitle("Paint drawing demonstration");
        JPanel headerPanel = new JPanel();
        headerPanel.add(new JLabel("The drawing panel is below"));
        JButton addNew = new JButton("Add New Graphic");
        addNew.addActionListener(new addNewClickHandler());
        headerPanel.add(addNew);
        frame.add(BorderLayout.NORTH,headerPanel);
        frame.add(BorderLayout.SOUTH,this.dp);
        frame.pack();
        frame.setVisible(true);
    }

    class DrawingPanel extends JPanel {

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            this.setBackground(Color.white);

            int x, posx, posy, width, height;

            for(x=0;x<=10;x++){
                //even number differentiation
                if(x % 2 == 0){
                    g.setColor(Color.red);
                }else{
                    g.setColor(Color.blue);
                }

                Random rand = new Random();
                posx = rand.nextInt(300);
                posy = rand.nextInt(300);
                width = rand.nextInt(40);
                height = rand.nextInt(40);

                //System.out.println("the ran x pos is: " + posx);
                g.fillRect(posx, posy, width, height);
            }//end for
         }//end paintComponent

        public Dimension getPreferredSize() {
           return new Dimension(400,400);
        }
    }// end DrawingPanel

    private class addNewClickHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            System.out.print("in addNew_click_handler click handler");//trace debug
            AddNewDrawItem newItem = new AddNewDrawItem();
            newItem.repaint();
            System.out.print("after repaint() in addNew_click_handler click  handler");//trace debug
            }
        }

    class AddNewDrawItem extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            this.setBackground(Color.white);
            int posx, posy, width, height;

            Random rand = new Random();
            posx = rand.nextInt(300);
            posy = rand.nextInt(300);
            width = rand.nextInt(40);
            height = rand.nextInt(40);
            g.setColor(Color.cyan);
            g.fillRect(posx, posy, width, height);

        }//end paintComponent
    }//end AddNewDrawItem

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

    }//end class Painter
解决方案

You've got some problems with your code, one of which is that you've got program logic in your paintComponent method: the code randomly changes values that are displayed within this method, meaning your display will change when it repaints, whether you want it to or not. To see that this is so, try to resize your GUI and you'll see some psychedelic changes in the drawn red and blue rectangles.

Now as to your current problem, the solution to it is similar to the solution to the problem I describe above. I suggest...

  • that you create an ArrayList<Rectangle2D>,
  • that you create your random rectangles in your class's constructor so that they're created only once, and then place them in the ArrayList above.
  • that you iterate through this ArrayList in your JPanel's paintComponent method, drawing them as you go. This way paintComponent does nothing but paint which is as it should be,
  • that you create a MouseAdapter-derived object and add it as a MouseListener and MouseMotionListener to your DrawingPanel
  • that you use the listener above to create a new Rectangle2D object and when done add it to the ArrayList and call repaint on the DrawingPanel
  • that you activate the mouse adapter via your button's action listener.

I'll stop there, but I think you get the idea, and if you don't, please ask any questions you may have.

这篇关于尝试单击按钮以在JPanel中添加动态定位的图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-31 03:25