Java의 이벤트 핸들러에서 JLabel에 선을 그리는 방법은 무엇입니까?

사용자 4964330

나는 이것에 열심히 노력해 왔으며 동일한 오류에 계속해서 직면하고 있습니다.

기본적으로 .png를로드 한 다음 두 번 클릭 한 후 선을 그리려고합니다.

public class GroundTruthMarker extends JPanel {

private JFrame frame;
boolean leftSideDone = false;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                GroundTruthMarker window = new GroundTruthMarker();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public GroundTruthMarker() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 1178, 844);
    frame.setResizable(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    // points to hold the clicked coordinates
    Point leftSide = new Point();
    Point rightSide = new Point();

    // status label
    JLabel lblStatus = new JLabel("");
    lblStatus.setBounds(373, 807, 134, 20);
    frame.getContentPane().add(lblStatus);

    JButton btnSave = new JButton("Save");
    btnSave.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            lblStatus.setText("Saved!");
        }
    });
    btnSave.setBounds(215, 807, 117, 25);
    frame.getContentPane().add(btnSave);

    JLabel lblpicture = new JLabel("");
    lblpicture.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {

            if (leftSideDone == false) {
                leftSide.x = e.getX();
                leftSide.y = e.getY();
                lblStatus.setText("Left Side Done!");
                leftSideDone = true;
            } else {
                rightSide.x = e.getX();
                rightSide.y = e.getY();
                lblStatus.setText("Right Side Done!");
                leftSideDone = false;

                Graphics g = getGraphics();
                g.setColor(Color.cyan);
                g.drawLine(leftSide.x, leftSide.y, rightSide.x, rightSide.y);
            }

        }
    });

    // picture label
    lblpicture.setBackground(Color.WHITE);
    lblpicture.setBounds(12, 12, 1154, 765);
    // create a line border with the specified color and width
    Border border = BorderFactory.createLineBorder(Color.BLUE, 1);
    // set the border of this component
    lblpicture.setBorder(border);
    frame.getContentPane().add(lblpicture);

    JButton btnLoadImages = new JButton("Load Images");
    btnLoadImages.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // set up the file chooser
            JFileChooser fileChooser = new JFileChooser();
            // only directories
            fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                File dir = fileChooser.getSelectedFile();
                // load from the directory
                System.out.println(dir.getName());
                // loop over the image directory
                if (dir.isDirectory()) { // make sure it's a directory
                    for (final File f : dir.listFiles()) {
                        BufferedImage img = null;
                        // read every image and display it in the gui
                        try {
                            lblStatus.setText("New Image!");
                            img = ImageIO.read(f);
                            lblpicture.setIcon(new ImageIcon(img));

                        } catch (final IOException e1) {
                            // handle errors here
                            System.out.println("Error:" + e1.getMessage());
                        }
                    }
                }
            }
        }
    });
    btnLoadImages.setBounds(23, 807, 144, 25);
    frame.getContentPane().add(btnLoadImages);
}

}

그리고 이것은 내가 한 줄을 기대할 때 런타임에서 얻는 오류입니다.

java.lang.NullPointerException
    at GroundTruthMarker$3.mouseClicked(GroundTruthMarker.java:101)
    at java.awt.Component.processMouseEvent(Component.java:6538)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6300)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4891)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4534)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

그리기는 이벤트 핸들러에서 수행되어야합니다. 몇 가지 방법을 시도했지만 "마우스 이벤트 처리기에서는이 작업을 수행 할 수 없습니다"라는 오류가 발생하여 작동하지 않았습니다.

도움을 주셔서 감사합니다.

감사.

ArcticLord

다음과 같이 코드를 변경하십시오.

public class GroundTruthMarker extends JPanel {

    private BufferedImage img = null;  // ADD THIS LINE
    [...]
    private void initialize() {
        [...]
        // JLabel lblpicture = new JLabel("");  // REMOVE THIS LINE
        // ADD THE FOLLOWING INSTEAD
        JPanel lblpicture = new JPanel(){
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(img,0,0,null);
                g.setColor(Color.cyan);
                g.drawLine(leftSide.x, leftSide.y, rightSide.x, rightSide.y);
            }
        };
        [...]
        public void mouseClicked(MouseEvent e) {
            [...]
            // REMOVE THIS!
            //Graphics g = getGraphics();
            //g.setColor(Color.cyan);
            //g.drawLine(leftSide.x, leftSide.y, rightSide.x, rightSide.y);
            // ADD THIS INSTEAD
            lblpicture.repaint();
        }
        [...]
        public void actionPerformed(ActionEvent e) {
            [...]
            // REMOVE THIS LINE
            //BufferedImage img = null;
            [...]
            // REMOVE THIS LINE
            //lblpicture.setIcon(new ImageIcon(img));
            // ADD THIS LINE INSTEAD
            lblpicture.repaint();
            [...]
        }
    }
}

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

VB6에서 핸들 (이벤트 핸들러가 아님)을 만드는 방법은 무엇입니까?

분류에서Dev

하나의 핸들러에서 여러 변경 이벤트를 처리하는 방법은 무엇입니까?

분류에서Dev

JavaScript의 이벤트 핸들러에서 공용 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

Flutter에서 위젯의 이벤트 핸들러 함수에 값을 올바르게 전달하는 방법은 무엇입니까?

분류에서Dev

소유 클래스 외부에서 이벤트 핸들러의 멤버십을 확인하는 방법은 무엇입니까?

분류에서Dev

Angular 2의 이벤트 핸들러에서 html 요소 속성 / 속성을 전달하는 방법은 무엇입니까?

분류에서Dev

MVVM에서 이벤트를 처리하는 동안 이벤트 핸들러의 두 번째 매개 변수를 보내는 방법은 무엇입니까?

분류에서Dev

jQuery에서 이벤트 핸들러는 무엇을 의미합니까?

분류에서Dev

speechRecognized 이벤트 핸들러에 RGB 프레임을 저장하는 방법은 무엇입니까?

분류에서Dev

두 이벤트 핸들러간에 값을 전달하는 방법은 무엇입니까?

분류에서Dev

"이벤트 핸들러에서 데이터베이스에 변경 사항을 저장할 수 없음"을 해결하는 방법은 무엇입니까?

분류에서Dev

로드 된 핸들러에서 컨트롤을 업데이트하는 방법은 무엇입니까?

분류에서Dev

jest에서 지연된 이벤트 핸들러를 테스트하는 방법은 무엇입니까?

분류에서Dev

빠른 클릭에서 en 이벤트 핸들러가 두 번 호출되는 것을 방지하는 방법은 무엇입니까?

분류에서Dev

Lua 이벤트 핸들러 함수에서 'self'를 얻는 방법은 무엇입니까?

분류에서Dev

React : 이벤트 핸들러 내에서 반응 후크를 호출하는 방법은 무엇입니까?

분류에서Dev

책임 체인에서 다음 핸들러의 종속성을 주입하는 방법은 무엇입니까?

분류에서Dev

람다 함수없이 React Native에서 단일 핸들러로 몇 개의 TextInput을 처리하는 방법은 무엇입니까?

분류에서Dev

타사 이벤트 핸들러 내에서 최신 상태 / 값을 사용하는 방법은 무엇입니까?

분류에서Dev

Nextjs의 다른 API 핸들러에서 API 핸들러에서 데이터를 가져 오는 방법은 무엇입니까?

분류에서Dev

CollectionViewSource.Filter 이벤트의 이벤트 핸들러에서 e와 item의 용도는 무엇입니까?

분류에서Dev

자바 스크립트 (jquery)-하나의 이벤트에 연결된 여러 핸들러 : 하나만 분리하는 방법은 무엇입니까?

분류에서Dev

React에서 자식 컴포넌트의 핸들러를 설정하는 방법은 무엇입니까?

분류에서Dev

gtk-notify-signal 핸들러에서 이전 값을 얻는 방법은 무엇입니까?

분류에서Dev

MultiComboBox의 선택 완료 이벤트에 대한 트리거를 식별하는 방법은 무엇입니까?

분류에서Dev

MultiComboBox의 선택 완료 이벤트에 대한 트리거를 식별하는 방법은 무엇입니까?

분류에서Dev

하나의 이미지에 곡선과 직선을 그리는 방법은 무엇입니까?

분류에서Dev

ConcurrentLinkedQueue : Java에서 핸들러를 구현하는 방법은 무엇입니까?

분류에서Dev

C #에서 이벤트 처리기의 응답을 기다리는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    VB6에서 핸들 (이벤트 핸들러가 아님)을 만드는 방법은 무엇입니까?

  2. 2

    하나의 핸들러에서 여러 변경 이벤트를 처리하는 방법은 무엇입니까?

  3. 3

    JavaScript의 이벤트 핸들러에서 공용 함수를 호출하는 방법은 무엇입니까?

  4. 4

    Flutter에서 위젯의 이벤트 핸들러 함수에 값을 올바르게 전달하는 방법은 무엇입니까?

  5. 5

    소유 클래스 외부에서 이벤트 핸들러의 멤버십을 확인하는 방법은 무엇입니까?

  6. 6

    Angular 2의 이벤트 핸들러에서 html 요소 속성 / 속성을 전달하는 방법은 무엇입니까?

  7. 7

    MVVM에서 이벤트를 처리하는 동안 이벤트 핸들러의 두 번째 매개 변수를 보내는 방법은 무엇입니까?

  8. 8

    jQuery에서 이벤트 핸들러는 무엇을 의미합니까?

  9. 9

    speechRecognized 이벤트 핸들러에 RGB 프레임을 저장하는 방법은 무엇입니까?

  10. 10

    두 이벤트 핸들러간에 값을 전달하는 방법은 무엇입니까?

  11. 11

    "이벤트 핸들러에서 데이터베이스에 변경 사항을 저장할 수 없음"을 해결하는 방법은 무엇입니까?

  12. 12

    로드 된 핸들러에서 컨트롤을 업데이트하는 방법은 무엇입니까?

  13. 13

    jest에서 지연된 이벤트 핸들러를 테스트하는 방법은 무엇입니까?

  14. 14

    빠른 클릭에서 en 이벤트 핸들러가 두 번 호출되는 것을 방지하는 방법은 무엇입니까?

  15. 15

    Lua 이벤트 핸들러 함수에서 'self'를 얻는 방법은 무엇입니까?

  16. 16

    React : 이벤트 핸들러 내에서 반응 후크를 호출하는 방법은 무엇입니까?

  17. 17

    책임 체인에서 다음 핸들러의 종속성을 주입하는 방법은 무엇입니까?

  18. 18

    람다 함수없이 React Native에서 단일 핸들러로 몇 개의 TextInput을 처리하는 방법은 무엇입니까?

  19. 19

    타사 이벤트 핸들러 내에서 최신 상태 / 값을 사용하는 방법은 무엇입니까?

  20. 20

    Nextjs의 다른 API 핸들러에서 API 핸들러에서 데이터를 가져 오는 방법은 무엇입니까?

  21. 21

    CollectionViewSource.Filter 이벤트의 이벤트 핸들러에서 e와 item의 용도는 무엇입니까?

  22. 22

    자바 스크립트 (jquery)-하나의 이벤트에 연결된 여러 핸들러 : 하나만 분리하는 방법은 무엇입니까?

  23. 23

    React에서 자식 컴포넌트의 핸들러를 설정하는 방법은 무엇입니까?

  24. 24

    gtk-notify-signal 핸들러에서 이전 값을 얻는 방법은 무엇입니까?

  25. 25

    MultiComboBox의 선택 완료 이벤트에 대한 트리거를 식별하는 방법은 무엇입니까?

  26. 26

    MultiComboBox의 선택 완료 이벤트에 대한 트리거를 식별하는 방법은 무엇입니까?

  27. 27

    하나의 이미지에 곡선과 직선을 그리는 방법은 무엇입니까?

  28. 28

    ConcurrentLinkedQueue : Java에서 핸들러를 구현하는 방법은 무엇입니까?

  29. 29

    C #에서 이벤트 처리기의 응답을 기다리는 방법은 무엇입니까?

뜨겁다태그

보관