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

单击按钮即可将形状添加到JPanel

曹镜
2023-03-14
问题内容

我有一个带有按钮的Class Circle和一个带有jPanel的Class
I,我想做的是单击该按钮时会在面板上绘制一个圆圈,每次我单击该按钮并更改x和y“有些不怎么实现在这里”,我一遍又一遍地在JPanel上绕了一圈。如何做到这一点,或者有一种方法可以执行我描述的内容,而不管我的代码如何,但是我希望类圈子扩展Shape。

public class Window{

  private JFrame frame;
  private JPanel panel = new JPanel();
  Circle c = new Circle(frame, panel);
  // some other buttons 
  .
  .
 // some code to set the panel grid bag constaraints and background then
 frame.getContentPane().add(panel, gbc_panel);
}

然后是圆班

public class Circle extends Shape implements ActionListener{

  private JPanel Panel;
  private GridBagConstraints gbc_btnCircle;
  private JButton btnCircle;

  public void setPanel(JPanel panel) {
      Panel = panel;
  }

 public Circle(JFrame frame, JPanel panel){
    btnCircle = new JButton("Circle");
    // some code to set grid bag constraint then
    frame.getContentPane().add(btnCircle, gbc_btnCircle);
    setPanel(panel);        
    btnCircle.addActionListener(this);

 }

  public void paint(Graphics g) {
      super.paintComponents(g);
      g.setColor(Color.red);        
      g.fillOval(100, 100, 100, 100);     
      Panel.add(this);
  }

  public void actionPerformed(ActionEvent arg0) {
    repaint();      
  }
}

问题答案:

您有点错误的主意。在绘图面板中,您应该有一个List<Circle>。在paintComponent绘图面板的方法中,您应该遍历列表以绘制每个圆

class Circle {
    int x, int y, int width, int height;
    public Circle (int x, int y, int width, int height) {
        ... set em
    }
    public void draw(Graphics g) {
        g.fillOval(x, y, width, height);
    }
}
class DrawingPanel extends JPanel {
    List<Circle> circles = new ArrayList<>();

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Circle circle : circles) {
            circle.draw(g);
        }
    }

    // Dont forget to override public Dimension getPreferredSize()
}

要将更多圈子添加到列表中,只需addCircleDrawingPanel类中有一个方法

public void addCircle(Circle circle) {
    circles.add(circle);
    repaint();
}

至于按钮,您应该在Window类中创建它。在中ActionListener,只需创建一个new Circle,然后DrawingPanel通过调用addCircle方法将其添加

顺便说一句,Circle不需要extend
Shape。该ShapeAPI已经有一个Ellipse2D类,您可以从中创建圈子

class DrawingPanel extends JPanel {
    List<Ellipse2D> circles = new ArrayList<>();

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g.create();
        for (Ellipse2D circle : circles) {
            g2.fill(circle);
        }
        g2.dispose();
    }
    // Dont forget to override public Dimension getPreferredSize()
}
  • 查看2D图形

更新:完整示例

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.html" target="_blank">swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class CirclesDemo {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new CirclesDemo();
            }
        });
    }

    public CirclesDemo() {
        JFrame frame = new JFrame();
        frame.add(panel);
        frame.add(createButton(), BorderLayout.PAGE_END);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private final DrawingPanel panel = new DrawingPanel();

    private JButton createButton() {
        JButton button = new JButton("Add Circle");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                int[] circleValues = generateRandomValues(300, 300, 50, 150);
                int x = circleValues[0];
                int y = circleValues[1];
                int width = circleValues[2];
                int height = width;
                Circle circle = new Circle(x, y, width, height);
                panel.addCircle(circle);
            }
        });
        return button;
    }

    private int[] generateRandomValues(int maxX, int maxY, 
                                       int minSize, int maxSize) {
        Random random = new Random();
        int[] values = new int[3];
        values[0] = random.nextInt(maxX);
        values[1] = random.nextInt(maxY);
        values[2] = Math.min(random.nextInt(maxSize) + minSize, maxSize);
        return values;
    }

    class Circle {

        int x, y, width, height;

        public Circle(int x, int y, int width, int height) {
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
        }

        public void draw(Graphics g) {
            g.drawOval(x, y, width, height);
        }
    }

    class DrawingPanel extends JPanel {

        List<Circle> circles = new ArrayList<>();

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (Circle circle : circles) {
                circle.draw(g);
            }
        }

        public void addCircle(Circle circle) {
            circles.add(circle);
            repaint();
        }

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


 类似资料:
  • 问题内容: 我搜索了在jtable中添加按钮的教程,并从http://tips4java.wordpress.com/2009/07/12/table-button- column/ 找到了一个类文件, 该按钮在哪里设置? 问题答案: 它是通过DefaultTableModel中的数据在表渲染器和编辑器中自动设置的。例如,对于表编辑器,代码为: 表模型的值在哪里。有关详细信息,请参见ButtonC

  • 问题内容: 我正在尝试制作一个通过JToggleButton激活的弹出面板。我希望在选择ToggleButton时将JPanel添加到另一个Jpanel上,而在取消选择ToggleButton时将其隐藏。 我已经声明了JToggleButton并使用了ItemListener。但是发生的事情是,当我选择ToggleButton时,如果我取消选择并再次选择它,则会创建一个面板,然后再次添加另一个JP

  • 我有一个简单表单,有四个输入字段(联系人id,电话号码,姓名,称呼)。如果我输入'contact id'&按Enter按钮,字段的其余部分将自动填充,从DB检索。现在我想在表单中添加一个“Submit”按钮,这样就可以通过单击该按钮将这些信息保存到另一个DB表中。我已经尝试添加按钮,但自动填充功能不再起作用了。有人能帮忙吗?提前致谢:)下面是我的index.html文件:

  • 问题内容: 接下来的代码使用Modal react组件: 我正在尝试使用以下方式调用它: 和 我的意思是,单击此按钮后,没有任何显示。还有另一种方法可以调用该模式吗?我从以下位置导入模式: 从“反应-响应-模态”导入模态 问题答案: 您试图仅在单击按钮后才渲染模态,这对于非反应性环境是很自然的,但在反应中它以不同的方式起作用。在最简单的解决方案中,应始终呈现,当用户单击按钮时,将modal 属性更

  • 问题内容: 单击链接时,我试图加载HTML模板。我已经制定了包含加载HTML文件的指令。单击链接时,我将调用带有自定义指令“myCustomer”的div附加到index.html中已存在的div的函数。我到目前为止所做的一切都显示在下面,但这不起作用。 index.html script.js my-customer.html 这是我在这里测试此代码的链接 问题答案: 这是因为如果您添加这样的内

  • 在连续单击5次按钮后,尝试将ngClass添加到div。 这是应用程序上的按钮。组成部分html文件: 这是应用程序。组成部分ts文件: 这是一个应用程序。组成部分css 目前,在单击第5个按钮后,logItem背景保持蓝色。我可以检查控制台,看到类。白文本已经添加,但文本仍然是黑色的。 下面是它的外观: 当我检查元素时,您可以看到已经添加了类: 我对Angular是个新手,我正沿着我的路线走,被