先看下代码,我想实现的就是,利用鼠标事件,当选择其中一个矩形框的时候,使得矩形框变成红色,并且把其对应的内容给显示出来,其中关于内容的显示部分已经完成,就是下面代码.关于当选择一个矩形框的时候使得矩形眶变成红色,我做不好,关于绘制部分很不熟悉,请各位帮忙.谢谢了!
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField; public class RectChoose extends JFrame {
    private static final long serialVersionUID = 1L;
    int[] a = { 100, 200, 300 ,99};
    int[] b = { 50, 150, 250 ,49};
    int[] c = { 50, 50, 50 ,80};
    int[] d = { 50, 50, 50 ,80};
    String[] str = { "显示第一个", "显示第二个", "显示第三个" ,"显示第四个"};
    JPanel jp = new MyJPanel();
    final JTextField jt = new JTextField();
    
    public static void main(String[] args) {
        new RectChoose();
    }
    
    public RectChoose(){
        add(jp, BorderLayout.CENTER);
        add(jt, BorderLayout.NORTH);
        jp.addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent e) {
                int x=e.getX();
                int y=e.getY();
                ArrayList list = new ArrayList();
                int k=0;
                for(int i=0;i<4;i++){
                    if(x>=a[i]&&x<=(a[i]+c[i])&&y>=b[i]&&y<=(b[i]+d[i])){
                     list.add(i);
         Integer[] nums = (Integer[]) list.toArray(new Integer[0]);
         k++;
         if(k==1)
         jt.setText(str[i]);
         else if(k==2){
         int a1=nums[0];
         int a2=nums[1];
         if((a[a1]+c[a1])<(a[a2]+c[a2]))
         jt.setText(str[a1]);
         else
         jt.setText(str[a2]);
         }
                    }
                }
            }
            
        });
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    
    class MyJPanel extends JPanel{
        public void paint(Graphics g) {
            for(int i=0;i<4;i++){
                g.drawRect(a[i], b[i], c[i], d[i]);
            }
        }
    }
}

解决方案 »

  1.   

    给你改好了,试试吧。
    另外建议楼主用J2D对象绘制矩形,不然代码太乱。import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseAdapter;
    import java.util.ArrayList;import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;public class RectChoose extends JFrame {
    private static final long serialVersionUID = 5616139155213961945L;
    private int chooseIndex;
    int[] a = { 100, 200, 300, 99 };
    int[] b = { 50, 150, 250, 49 };
    int[] c = { 50, 50, 50, 80 };
    int[] d = { 50, 50, 50, 80 };
    String[] str = { "显示第一个", "显示第二个", "显示第三个", "显示第四个" };
    JPanel jp = new MyJPanel();
    final JTextField jt = new JTextField(); public static void main(String[] args) {
    new RectChoose();
    } public RectChoose() {
    add(jp, BorderLayout.CENTER);
    add(jt, BorderLayout.NORTH);
    jp.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();
    ArrayList<Integer> list = new ArrayList<Integer>();
    int k = 0;
    for (int i = 0; i < 4; i++) {
    if (x >= a[i] && x <= (a[i] + c[i]) && y >= b[i]
    && y <= (b[i] + d[i])) {
    list.add(i);
    Integer[] nums = (Integer[]) list
    .toArray(new Integer[0]);
    k++;
    if (k == 1) {
    chooseIndex = i;
    } else if (k == 2) {
    int a1 = nums[0];
    int a2 = nums[1];
    chooseIndex = (a[a1] + c[a1]) < (a[a2] + c[a2]) ? a1 : a2;
    }
    jt.setText(str[chooseIndex]);
    repaint();
    }
    }
    } });
    setSize(600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    } class MyJPanel extends JPanel {
    private static final long serialVersionUID = -724828842932429886L;
    private Color chooseColor = Color.red;
    public void paint(Graphics g) {
    for (int i = 0; i < 4; i++) {
    if (i == chooseIndex) {
    Color oldColor = g.getColor();
    g.setColor(chooseColor);
    g.drawRect(a[i], b[i], c[i], d[i]);
    g.setColor(oldColor);
    } else {
    g.drawRect(a[i], b[i], c[i], d[i]);
    }
    }
    }
    }
    }
      

  2.   

    哦,首先谢谢  lasfrost.有个问题,就是这个代码只要一运行,由于i=0,所以第一个矩形眶就是红色的,也就是说不选择该矩形眶的时候它也是红色的.我想要的是运行的时候都是黑色的,当选择的时候才变成红色.
      

  3.   

    我的想法是这样的,重写drawRect方法,在该方法中添加一个参数,该参数为设置其颜色的部分.我对该部分不了解.不知道这样可以把,我实现不出来.大家帮帮我.小弟先谢了!
      

  4.   

    第一个问题,把private int chooseIndex;赋初值private int chooseIndex = -1;第二个问题,重写drawRect方法,首先你不知道重写哪个类的drawRect,另外这也不太符合OO思想,你的Color对象还得另外存储。LZ不用J2D对象的话可以自己实现一个Rect类,把坐标和颜色封装在里面,并提供绘制方法。
    这样:import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Rectangle;public class Rect {
    private Rectangle r;
    private Color c;
    public Rect(int x, int y, int width, int height, Color c) {
    this(new Rectangle(x, y, width, height), c);
    }
    public Rect(Rectangle r, Color c) {
    this.r = r;
    this.c = c;
    }
    public void draw(Graphics g) {
    Color oldColor = g.getColor();
    g.setColor(c);
    g.drawRect(r.x, r.y, r.width, r.height);
    g.setColor(oldColor);
    }
    }用法我就不说了,很简单。
      

  5.   

    是啊,第二个方法就是重写的方法抛弃了OO的思想,呵呵,谢谢lasfrost了.以后多跟你学习!