2016-10-11 2 views
1

방금 ​​JAVA 및 스윙 학습을 시작했습니다. 그래서 책을 읽은 후에이 코드를 실행했습니다. 이 기능은 원의 색상을 변경하는 버튼과 라벨의 텍스트를 변경하는 버튼을 제공합니다. 하지만 레이블의 텍스트를 변경하기 위해 만들어진 버튼 (첫 번째 시간)을 클릭하면 원의 색상도 변경됩니다. 첫 번째 이후에는 발생하지 않습니다. 이 문제를 피하기 위해 어떻게해야합니까? 그리고 왜 그런 일이 일어날 수 있는지 설명 할 수 있습니까? setText 결국 임의의 색상으로 색상을 변경 paintComponent를 호출하기 때문에하나의 버튼을 클릭하면 JAVA 스윙에서 다른 버튼의 actionListener가 호출됩니다.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

class DrawPanel extends JPanel 
{ 
    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2D = (Graphics2D) g; 
     int red = (int)(Math.random() * 255); 
     int green = (int)(Math.random() * 255); 
     int blue = (int)(Math.random() * 255); 
     Color start = new Color(red, green, blue); 

     red = (int)(Math.random() * 255); 
     green = (int)(Math.random() * 255); 
     blue = (int)(Math.random() * 255); 
     Color end = new Color(red, green, blue); 

     GradientPaint gradient = new GradientPaint(60, 60, start, 170, 170, end); 

     g2D.setPaint(gradient); 
     g2D.fillOval(70, 70, 100, 100); 
    } 
} 

class TwoButton 
{ 
    private DrawPanel dp; 
    private JFrame frame; 
    private JLabel label; 

    public static void main(String[] args) 
    { 
     TwoButton gui = new TwoButton(); 
     gui.go(); 
    } 
    private void go() 
    { 
     frame = new JFrame(); 
     label = new JLabel("I'm a label"); 
     dp = new DrawPanel(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton colorButton = new JButton("Change color"); 
     JButton labelButton = new JButton("Change label"); 
     colorButton.addActionListener(new ColorListener()); 
     labelButton.addActionListener(new LabelListener()); 

     frame.setSize(400, 400); 
     frame.setVisible(true); 
     frame.getContentPane().add(BorderLayout.SOUTH, colorButton); 
     frame.getContentPane().add(BorderLayout.CENTER, dp); 
     frame.getContentPane().add(BorderLayout.EAST, labelButton); 
     frame.getContentPane().add(BorderLayout.WEST, label); 

    } 
    class ColorListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent event) 
     { 
      frame.repaint(); 
     } 
    } 
    class LabelListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent event) 
     { 
      label.setText("Good Job!"); 
     } 
    } 
} 
+0

또한 잊지 말아야 할 사항 : 1) 'paintComponent', 2) make 'paintComponent','protected' 메소드를 포함하여 오버라이드 할 수 있다고 생각하는 모든 메소드 위에'@ Override' 주석을 추가하십시오. , public이 아니라 3) 메소드 오버라이드에서 super.paintComponent (g);를 호출한다. 아마도 메소드의 첫 번째 호출이다. –

답변

2

이 발생합니다 다음은 코드입니다. 그래픽을 다시 그리지 않고 텍스트를 변경할 수 없기 때문에이 문제가 발생합니다. 그래픽을 그리는 데 사용 된 메서드 인 paintComponent이 포함되어 있습니다.

하지만 텍스트가 실제로 변경된 경우에만 해당 텍스트가 변경되므로 두 번째로 버튼을 클릭해도 텍스트가 변경되지 않으므로 아무 것도 일어나지 않습니다. 여전히 "Good Job!"입니다.

기본적으로 버튼은 다른 버튼의 액션 리스너를 호출하지 않지만 두 액션 리스너는 결국 paintComponent을 호출합니다. 레이블의 텍스트가 실제로 변경된 경우 첫 번째 클릭 만 전달됩니다.

이 문제를 해결하려면 색상이 랜덤 화 된 부분을 작업 수신기로 옮기고 paintComponent 메서드 밖으로 이동하십시오.

+0

고맙습니다. – Arindam

+0

@Arindam 문제 없습니다. 그것이 도움이된다면 upvote 받아 =] – nhouser9

+1

@ Arindam : 그래서 솔루션입니다 : paintComponent 및 ActionListener 중 임의 화 ** out ** 가져 오기. –

관련 문제