Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与交互时更改颜色的矩形_Java_Jframe_Jpanel - Fatal编程技术网

Java 与交互时更改颜色的矩形

Java 与交互时更改颜色的矩形,java,jframe,jpanel,Java,Jframe,Jpanel,该程序应该制作一个网格,其中所有矩形都从黑色开始,如果单击或拖动,它们将变为白色。到目前为止,我的程序能够使你点击或拖动的矩形变为白色,但它不会记住或记住我点击了哪个矩形,使它们保持白色,直到你再次点击它们。也许我会使用鼠标侦听器调用更改,或者创建一个LinkedList,我只是想不出最简单的解决方案 public class Clicky extends JFrame { private static class Board extends JPanel { private double

该程序应该制作一个网格,其中所有矩形都从黑色开始,如果单击或拖动,它们将变为白色。到目前为止,我的程序能够使你点击或拖动的矩形变为白色,但它不会记住或记住我点击了哪个矩形,使它们保持白色,直到你再次点击它们。也许我会使用鼠标侦听器调用更改,或者创建一个LinkedList,我只是想不出最简单的解决方案

public class Clicky extends JFrame {

private static class Board extends JPanel {

private double BRICK_WIDTH = 20;
private double BRICK_HEIGHT = 20;

public Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
public double width = screenSize.getWidth();
public double height = screenSize.getHeight();

private int COLS = (int)(width/BRICK_WIDTH);
private int ROWS =(int)(height/BRICK_HEIGHT);
private Color CO = Color.BLACK;


public Board() {
    System.out.println("WIdth:" + COLS + "Height:" + ROWS);
    setBackground(Color.BLACK);
    addMouseListener(new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent e) {
            mx = e.getX();
            my = e.getY();
            System.out.printf("X: %d Y: %d ", mx, my);
            repaint();
        }
    });

    addMouseMotionListener(new MouseMotionListener() {
        @Override
        public void mouseDragged(MouseEvent e) {
            mx = e.getX();
            my = e.getY();

        }

        @Override
        public void mouseMoved(MouseEvent e) {

        }
    });
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    drawBricks(g);
}


private double x;
private double y;

private void drawBricks(Graphics g) {

    Graphics2D brick = (Graphics2D) g.create();
    x = 0;
    y = 0;
    for (int j = 0; j <= ROWS; j++)
    {
        for (int a = 0; a <= COLS; a++) {
            brick.setColor(Color.BLACK);
            Rectangle2D.Double rect = new Rectangle2D.Double(x, y, BRICK_WIDTH, BRICK_HEIGHT);
            brick.fill(rect);
            if (mx > x && mx < x + BRICK_WIDTH && my > y && my < y + BRICK_HEIGHT) {
                if (brick.getColor() == Color.BLACK) {
                    CO = Color.white;
                    brick.setColor(CO);
                    brick.fill(rect);
                repaint();
                }
                else {
                    CO = Color.BLACK;
                    brick.setColor(CO);
                    brick.fill(rect);
                repaint();
                }
            }


            brick.setColor(Color.gray);
            brick.draw(rect);
            x += BRICK_WIDTH;
        }
        repaint();
        x = 0;
        y += BRICK_HEIGHT;
        }

}
public int mx = -100;
public int my = -100;
}

public Clicky() {

setDefaultCloseOperation(EXIT_ON_CLOSE);    //mai bine cu exit on close
setSize(800, 820);
add(new Board());
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
        new Clicky().setVisible(true);
    }
});
public类Clicky扩展JFrame{
私有静态类板扩展JPanel{
私人双砖_宽度=20;
私人双砖_高度=20;
公共维度screenSize=Toolkit.getDefaultToolkit().getScreenSize();
public double width=screenSize.getWidth();
public double height=screenSize.getHeight();
私有整数COLS=(整数)(宽度/砖块宽度);
私有整数行=(整数)(高度/砖块高度);
私有颜色CO=颜色为黑色;
公共委员会(){
System.out.println(“宽度:+COLS+”高度:+ROWS”);
挫折背景(颜色:黑色);
addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
mx=e.getX();
my=e.getY();
System.out.printf(“X:%d Y:%d”,mx,my);
重新油漆();
}
});
addMouseMotionListener(新的MouseMotionListener(){
@凌驾
公共无效鼠标标记(鼠标事件e){
mx=e.getX();
my=e.getY();
}
@凌驾
public void mouseMoved(MouseEvent e){
}
});
}
@凌驾
受保护组件(图形g){
超级组件(g);
抽芯砖(g);
}
私人双x;
私人双y;
专用空心抽油砖(图形g){
Graphics2D brick=(Graphics2D)g.create();
x=0;
y=0;
对于(int j=0;j y&&my

}一个简单的解决方案是使用表示矩形状态的二维布尔数组。颜色更改时,更改数组元素的值,并根据其设置颜色:

public class Clicky extends JFrame {

private static class Board extends JPanel {

    private double BRICK_WIDTH = 20;
    private double BRICK_HEIGHT = 20;

    public Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    public double width = screenSize.getWidth();
    public double height = screenSize.getHeight();

    private int COLS = (int) (width / BRICK_WIDTH);
    private int ROWS = (int) (height / BRICK_HEIGHT);
    private Color CO = Color.BLACK;

    private boolean[][] isWhite = new boolean[COLS + 1][ROWS + 1];

    public Board() {
        System.out.println("WIdth:" + COLS + "Height:" + ROWS);
        setBackground(Color.BLACK);
        addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                mx = e.getX();
                my = e.getY();
                System.out.printf("X: %d Y: %d ", mx, my);
                isWhite[(int) (mx / BRICK_WIDTH)][(int) (my
                        / BRICK_HEIGHT)] = !isWhite[(int) (mx / BRICK_WIDTH)][(int) (my / BRICK_HEIGHT)];
                repaint();
            }
        });

        addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseDragged(MouseEvent e) {
                mx = e.getX();
                my = e.getY();
                isWhite[(int) (mx / BRICK_WIDTH)][(int) (my
                        / BRICK_HEIGHT)] = !isWhite[(int) (mx / BRICK_WIDTH)][(int) (my / BRICK_HEIGHT)];
            }

            @Override
            public void mouseMoved(MouseEvent e) {

            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawBricks(g);
    }

    private double x;
    private double y;

    private void drawBricks(Graphics g) {

        Graphics2D brick = (Graphics2D) g.create();
        x = 0;
        y = 0;
        for (int j = 0; j <= ROWS; j++) {
            for (int a = 0; a <= COLS; a++) {
                if (isWhite[a][j]) {
                    brick.setColor(Color.WHITE);
                } else {
                    brick.setColor(Color.BLACK);
                }
                Rectangle2D.Double rect = new Rectangle2D.Double(x, y, BRICK_WIDTH, BRICK_HEIGHT);
                brick.fill(rect);

                brick.setColor(Color.gray);
                brick.draw(rect);
                x += BRICK_WIDTH;
            }
            repaint();
            x = 0;
            y += BRICK_HEIGHT;
        }

    }

    public int mx = -100;
    public int my = -100;
}

public Clicky() {

    setDefaultCloseOperation(EXIT_ON_CLOSE); // mai bine cu exit on close
    setSize(800, 820);
    add(new Board());
}

public static void main(String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            new Clicky().setVisible(true);
        }
    });
}
}
public类Clicky扩展JFrame{
私有静态类板扩展JPanel{
私人双砖_宽度=20;
私人双砖_高度=20;
公共维度screenSize=Toolkit.getDefaultToolkit().getScreenSize();
public double width=screenSize.getWidth();
public double height=screenSize.getHeight();
私有整数COLS=(整数)(宽度/砖块宽度);
私有整数行=(整数)(高度/砖块高度);
私有颜色CO=颜色为黑色;
私有布尔值[][]isWhite=新布尔值[COLS+1][ROWS+1];
公共委员会(){
System.out.println(“宽度:+COLS+”高度:+ROWS”);
挫折背景(颜色:黑色);
addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标按下(MouseEvent e){
mx=e.getX();
my=e.getY();
System.out.printf(“X:%d Y:%d”,mx,my);
isWhite[(内部)(mx/砖宽)][(内部)(我的
/砖块高度]=!isWhite[(内部)(mx/砖块宽度)][(内部)(我的/砖块高度)];
重新油漆();
}
});
addMouseMotionListener(新的MouseMotionListener(){
@凌驾
公共无效鼠标标记(鼠标事件e){
mx=e.getX();
my=e.getY();
isWhite[(内部)(mx/砖宽)][(内部)(我的
/砖块高度]=!isWhite[(内部)(mx/砖块宽度)][(内部)(我的/砖块高度)];
}
@凌驾
public void mouseMoved(MouseEvent e){
}
});
}
@凌驾
受保护组件(图形g){
超级组件(g);
抽芯砖(g);
}
私人双x;
私人双y;
专用空心砖(图g){
Graphics2D brick=(Graphics2D)g.create();
x=0;
y=0;
对于(int j=0;j