【问题标题】:Drawing Shape with ActionListener from Another Class使用另一个类的 ActionListener 绘制形状
【发布时间】:2017-12-15 13:43:27
【问题描述】:

在我的程序中,我将在 JPanel 中询问矩形的数量,并使用创建按钮将它们添加到框架中。我想从另一个类中调用矩形。但我看不到我的矩形。当我在主类中编写相同的绘制方法时,我可以看到矩形,但是当我运行程序时它们会出现。我希望它们与 actionlistener 一起出现。我究竟做错了什么?这是我的课;

矩形类:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Rectangle extends JFrame {

public int getX() {
    return x;
}
public void setX(int x) {
    this.x = x;
}
public int getY() {
    return y;
}
public void setY(int y) {
    this.y = y;
}
public int getW() {
    return w;
}
public void setW(int w) {
    this.w = w;
}
public int getH() {
    return h;
}
public void setH(int h) {
    this.h = h;
}
public Color getC() {
    return c;
}
public void setC(Color c) {
    this.c = c;
}
private int x,y,w,h;
private Color c;
private asgn3 a3;
public Rectangle() {


}

@Override
public void paint(Graphics g) {
super.paint(g); 

g.fillRect(getX(), getY(), getW(), getH());
g.setColor(Color.red);

}

}

我的主要 JFrame 类:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Example extends JFrame implements ActionListener {
private JTextField recttext;
private JButton create;
private JLabel rectlabel,createlabel;
private int seat a;
private Rectangle[] rect;


public Example() {
    setLayout(null);

    recttext = new JTextField();
    recttext.setSize(150, 40);
    recttext.setLocation(100, 40);
    add(recttext);


    rectlabel = new JLabel("Rectangle number");
    rectlabel.setSize(100, 20);
    rectlabel.setLocation(102, 20);
    add(rectlabel);


    create = new JButton("Create");
    create.setSize(70,30);
    create.setLocation(670, 20);
    add(create);
    create.addActionListener(this);


    setSize(800,800);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);

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

}
@Override
public void actionPerformed(ActionEvent e) {


   if(e.getSource().equals(create)) {
    a = Integer.parseInt(recttext.getText());

    rect = new Rectangle[a];
    for(int i=0;i<a;i++) {
        rect[i]= new Rectangle();

    }   

    for(int i=1;i<=a/10;i++) {
    for(int j=i;j<11;j++) {
        rect[i-1].setX((getWidth()/(a/10))*i+20);
        rect[i-1].setY(100+j*50);
        rect[i-1].setW(100);
        rect[i-1].setH(50);

        repaint();

    }
    }

}

}
}

【问题讨论】:

  • 为什么你的 Rectangle 扩展了 JFrame?

标签: java swing actionlistener paint


【解决方案1】:

当我在主类中编写相同的绘制方法时

什么画法?您的代码所做的只是创建一个 Rectangle 对象数组。你没有代码来做任何绘画。

绘画的工作方式是覆盖JPanel 的paintComponent()。所以你需要为你的绘画创建一个自定义的 JPanel。然后创建一个 Rectangle 对象的 ArrayList。在 paintComponent() 方法中,您遍历 ArrayList 并绘制每个 Rectangle。

阅读 Custom Painting 上的 Swing 教程中的部分,了解一个简单的示例来帮助您入门。

您还可以查看Custom Painting Approaches 中的DrawOnComponent 示例。它演示了如何动态添加要绘制的 Rectangle 对象。关键是每次要显示另一个 Rectangle 时都使用 addRectangle(...) 方法。

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多