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