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