ActionListener和对象定位问题

时间:2014-07-15 09:58:47

标签: java

每当我点击按钮时,下面的代码都会绘制一个矩形,我想要只绘制一次矩形,无论单击按钮多少次。另外,我如何将矩形定位在框架的中心和上方的按钮?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;

class rectangle{
    public static void main(String args[]){
        EventQueue.invokeLater(new Runnable(){
            public void run(){

                final JFrame frame=new JFrame("RECTANGLE");
                final JPanel panel=new JPanel();
                JButton button=new JButton("DRAW");
                panel.add(button);
                frame.add(panel);
                frame.setSize(400,400);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                button.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent event){

                        panel.add(new drawrectangle());


                    }
                });
            }
        });
     }
}

class drawrectangle extends JComponent{
    public void paintComponent(Graphics g){
        Graphics2D g2=(Graphics2D) g;
        g2.setPaint(Color.BLACK);
        Rectangle2D rect=new Rectangle2D.Double(50,50,200,200);
        g2.draw(rect);
        g2.fill(rect);
    }

}

3 个答案:

答案 0 :(得分:0)

您可以声明字段

boolean firstClick = true;

比写那样:

public void actionPerformed(ActionEvent event){
                        if(firstClick){
                        panel.add(new drawrectangle()); }
                        firstClick = false;

}

答案 1 :(得分:0)

要回答您的第一个问题,您可以使用变量跟踪按钮被按下的次数,并使用actionPerformed()方法将其递增。然后,您将知道按下按钮的次数并采取相应的操作。

要回答您的第二个问题,更简单的方法是使用BorderLayout。在一个面板上创建两个JPanel添加按钮,并将其添加到NORTH,然后将第二个面板添加到CENTRE。然后,当您按下按钮时,您可以将矩形添加到CENTER中的面板。

困难的方法,但更精确的方法是通过删除布局管理器(panel.setLayout(null))手动放置按钮和矩形,然后指定所有组件的大小和位置。然后,您还必须跟踪窗口状态等的变化。

另一种方法是使用GridBagLayout,这是第一种和第二种方法之间的重要平衡。

答案 2 :(得分:0)

  

每当我点击按钮时,下面的代码都会绘制一个矩形,我想要只绘制一次矩形,无论单击按钮多少次。另外,我如何将矩形定位在框架的中心和上方的按钮?

  1. 当您点击按钮时,没有您发布的代码根本不绘制矩形。
  2. 只需计算点击按钮的频率,以及是否是第一次将按钮添加到JPanel。
  3. 您可以使用BorderLayout将Rectangle定位在中间,将按钮定位在它上方。