JLabel 행렬을 그래픽 디스플레이로 변환

로봇 Karel314

저는 최근에 JLabels 매트릭스를 포함하는 JPanel과 관련된 프로젝트를 마쳤으며, 각각 사용자가 원하는대로 활성 / 비활성 상태가되기 위해 자체 MouseListener가 추가되었습니다. 이 프로젝트는 효과가 있었지만 오래된 컴퓨터에서는 프로젝트가 매우 느리다는 불만을 받았고, 제가 한 방식은 쉽지만 끔찍하게 비효율적이라는 것을 알고 있습니다. 다음은 내가 작성한 코드의 단순화 된 버전입니다.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class LifeDriver {
   public static void main(String[] args) {
      JFrame frame = new JFrame("Test");
      frame.setSize(950, 850);
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setContentPane(new LifePanel(40, 50));
      frame.setVisible(true);
   }
}
class LifePanel extends JPanel {
   private Cell[][] grid;
   private static int nR, nC;
   public LifePanel(int row, int column) {
      nR = row;
      nC = column;
      grid = new Cell[row][column];
      setLayout(new GridLayout(row, column, 1, 1));
      for (int r = 0; r < row; r++)
         for (int c = 0; c < column; c++)
         {
           grid[r][c] = new Cell();
           add(grid[r][c]);
         }
   }
}
class Cell extends JLabel
{
   private boolean alive;
   private static boolean mouseDown;
   public Cell() {
      setOpaque(true);
      addMouseListener(new Mouse());
      kill();
   }
   public void revive() {
      setAlive(true);
   }
   public void kill() {
      setAlive(false);
   }
   public void setAlive(boolean arg) {
      alive = arg;
      if (arg)
         setBackground(Color.RED);
      else
         setBackground(Color.WHITE);
   }
   private class Mouse extends MouseAdapter {
      public void mousePressed(MouseEvent e) {
         mouseDown = true;
         if (alive)
            kill();
         else 
            revive();
      }

      public void mouseReleased(MouseEvent e) {
         mouseDown = false;
      }

      public void mouseEntered(MouseEvent e) {
         if (mouseDown)
            if (alive)
               kill();
            else 
               revive();
      }
   }
}

내가 다시 갈 내가 하나의 MouseListener를 가질 수 있도록이를 변경하려면 LifePanel, 그리고 사용 getX()하고 getY(), (더 이상 JLabel의 확장)를 클릭 된 "셀"을 결정하고 세포 변화를 색상을 가지고, 다음 패널에 자신을 페인트. 다음과 같은 것 :

class LifePanel extends JPanel {
   BufferedImage myImage;
   Graphics g;
   ...
   class Mouse extends MouseAdapter {
      public void mousePressed(MouseEvent e) {
         grid[someRow][someColumn].draw(g) //use e.getX() and e.getY()
      }
      public void mouseEntered(MouseEvent e) {
         //similar to above
      }
   }
}

class Cell {
   //other methods
   public void draw(Graphics g) {
      g.setColor(myColor);
      g.fillRect(someX, someY, someWidth, someHeight);
   }
}

마우스 클릭이 원래 코드와 동일한 결과를 가져 오도록이 두 상황에서 사용할 적절한 값을 어떻게 결정합니까?

Camickr

2D 배열이 필요하지 않습니다.

대신 개체 ArrayList를 포함 하는를 사용 Cell합니다. Cell객체는 두 가지 속성을 포함 할 수있다 :

  1. Cell이 그려 져야하는 위치의 크기 / 위치를 나타내는 Rectangle 객체
  2. 칠할 때 셀의 색상.

그런 다음 패널의 사용자 정의 페인팅 코드는 ArrayList를 반복하고 각 셀을 페인팅합니다.

MouseListener의 경우 마우스 클릭의 Point를 얻고 ArrayList를 반복하고 Rectangle.contains (...) 메서드를 사용하여 Cell에 마우스 포인트가 포함되어 있는지 확인합니다. 적절한 Cell을 찾으면 처리를합니다.

Custom Painting ApproachesDraw On Component있는 예제를 확인하십시오 . 이 접근 방식을 사용하여 그림을 그리는 개념을 보여줍니다. 마우스 처리를 위해 고유 한 코드를 추가해야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이해 그래픽 (변환 행렬 cm)이 PDF 파일 시스템 (그래픽 파싱 위치)를 좌표?

분류에서Dev

Java는 문자열을 JLabel로 변환

분류에서Dev

환경 변수 설정을위한 그래픽 인터페이스 시작

분류에서Dev

"Crossdist"클래스의 교차 거리 행렬을 행렬로 변환

분류에서Dev

R-null 레이블이있는 ggplot2 그래픽에서 NA 레이블을 플롯으로 변환합니다.

분류에서Dev

이 인접 행렬을 그래프 객체로 어떻게 변환합니까?

분류에서Dev

ffmpeg 모든 오디오 형식을 플래시 플레이어 호환 오디오로 변환

분류에서Dev

셀을 행렬로 변환

분류에서Dev

행렬을 열로 변환

분류에서Dev

바인딩 소스 변경시 그래픽 작업 실행

분류에서Dev

Linux에서 그래픽 로그인을위한 환경 변수를 어떻게 설정할 수 있습니까?

분류에서Dev

이분 그래프를 인접 행렬로 변환 Spark Scala

분류에서Dev

클래스 네트워크 객체의 ** 하이퍼 그래프 **에서 행렬을 변환하는 방법

분류에서Dev

파이썬에서 0/1 행렬을 2D 그리드 그래프로 변환

분류에서Dev

출판 용 고품질 그래픽의 내장 플롯을 변환 하시겠습니까?

분류에서Dev

R-행렬을 아래쪽과 행에서 벡터로 변환

분류에서Dev

내 JLabel의 외부 클래스에서 사용하기 위해 내부 클래스의 "디스플레이"변수를 어떻게 참조합니까?

분류에서Dev

사용자 입력을 그래픽 막대로 변환하는 데 문제가 있습니다.

분류에서Dev

Android SVG 그래픽-현재 PNG 파일을 svg 형식으로 변환 할 때의 단점

분류에서Dev

Android SVG 그래픽-현재 PNG 파일을 svg 형식으로 변환 할 때의 단점

분류에서Dev

getBufferSubData 그래픽 파이프 라인 중단을 방지하기위한 변환 피드백에 대한 콜백

분류에서Dev

디스플레이 회전에서 프로그래밍 방식으로 레이아웃 제약 조건을 변경하는 방법

분류에서Dev

RGB 비디오 입력을 그레이 스케일 출력으로 변환

분류에서Dev

클래스간에 JLabel을 변경할 수 없습니다.

분류에서Dev

응용 프로그램을 전환 할 때 Gnome 3.20 그래픽 결함

분류에서Dev

그래픽의 상자 그림을 격자의 bwplot으로 변경

분류에서Dev

그래픽 PipelineView 변환

분류에서Dev

R 프로그래밍에서 인자 유형을 행렬의 열의 정수 유형으로 변환

분류에서Dev

데이터 프레임을 여러 그룹이있는 행렬로 강제 변환

Related 관련 기사

  1. 1

    이해 그래픽 (변환 행렬 cm)이 PDF 파일 시스템 (그래픽 파싱 위치)를 좌표?

  2. 2

    Java는 문자열을 JLabel로 변환

  3. 3

    환경 변수 설정을위한 그래픽 인터페이스 시작

  4. 4

    "Crossdist"클래스의 교차 거리 행렬을 행렬로 변환

  5. 5

    R-null 레이블이있는 ggplot2 그래픽에서 NA 레이블을 플롯으로 변환합니다.

  6. 6

    이 인접 행렬을 그래프 객체로 어떻게 변환합니까?

  7. 7

    ffmpeg 모든 오디오 형식을 플래시 플레이어 호환 오디오로 변환

  8. 8

    셀을 행렬로 변환

  9. 9

    행렬을 열로 변환

  10. 10

    바인딩 소스 변경시 그래픽 작업 실행

  11. 11

    Linux에서 그래픽 로그인을위한 환경 변수를 어떻게 설정할 수 있습니까?

  12. 12

    이분 그래프를 인접 행렬로 변환 Spark Scala

  13. 13

    클래스 네트워크 객체의 ** 하이퍼 그래프 **에서 행렬을 변환하는 방법

  14. 14

    파이썬에서 0/1 행렬을 2D 그리드 그래프로 변환

  15. 15

    출판 용 고품질 그래픽의 내장 플롯을 변환 하시겠습니까?

  16. 16

    R-행렬을 아래쪽과 행에서 벡터로 변환

  17. 17

    내 JLabel의 외부 클래스에서 사용하기 위해 내부 클래스의 "디스플레이"변수를 어떻게 참조합니까?

  18. 18

    사용자 입력을 그래픽 막대로 변환하는 데 문제가 있습니다.

  19. 19

    Android SVG 그래픽-현재 PNG 파일을 svg 형식으로 변환 할 때의 단점

  20. 20

    Android SVG 그래픽-현재 PNG 파일을 svg 형식으로 변환 할 때의 단점

  21. 21

    getBufferSubData 그래픽 파이프 라인 중단을 방지하기위한 변환 피드백에 대한 콜백

  22. 22

    디스플레이 회전에서 프로그래밍 방식으로 레이아웃 제약 조건을 변경하는 방법

  23. 23

    RGB 비디오 입력을 그레이 스케일 출력으로 변환

  24. 24

    클래스간에 JLabel을 변경할 수 없습니다.

  25. 25

    응용 프로그램을 전환 할 때 Gnome 3.20 그래픽 결함

  26. 26

    그래픽의 상자 그림을 격자의 bwplot으로 변경

  27. 27

    그래픽 PipelineView 변환

  28. 28

    R 프로그래밍에서 인자 유형을 행렬의 열의 정수 유형으로 변환

  29. 29

    데이터 프레임을 여러 그룹이있는 행렬로 강제 변환

뜨겁다태그

보관