O programa abaixo foi extraido do livro

Java for Students, 6th edition, e tem erros conceituais:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class java4students extends JFrame implements ActionListener {

  private JButton button;

  private JPanel panel;

 

  public static void main(String[] arg ){

    java4students frame = new java4students();

    frame.setSize(400, 300);

    frame.createGUI();

    frame.setVisible(true);

  }

  private void createGUI(){

    setDefaultCloseOperation(EXIT_ON_CLOSE);

    Container window = getContentPane();

    window.setLayout(new FlowLayout() );

    panel = new JPanel();

    panel.setPreferredSize(new Dimension(300, 200));

    panel.setBackground(Color.white);

    window.add(panel);

    button = new JButton("Press me");

    window.add(button);

    button.addActionListener(this);

  }

  public void actionPerformed(ActionEvent event) {

    Graphics paper = panel.getGraphics();

    paper.drawLine(0, 0, 100, 100);

  }

}

 

Exercício: (i)qual é o erro? 

(ii)Como escrever uma versão do programa acima sem o erro conceitual?

O erro é escrever em um componente sem garantia de que a escrita será exibida, este erro está presente no trecho:

  public void actionPerformed(ActionEvent event) {

    Graphics paper = panel.getGraphics();

    paper.drawLine(0, 0, 100, 100);

  }

 

Abaixo uma possível versão sem esse erro conceitual. Observe o uso de uma classe interna para

poder definir o método

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

public class java4studentsCB extends JFrame implements ActionListener{

  private JButton button;

  private JPanel panel;

  private boolean drawLineEnabled=false;

 

  class MyPanel extends JPanel{

    public void paintComponent(Graphics g){

      super.paintComponent(g);

      if(drawLineEnabled)

        g.drawLine(0, 0, 100, 100);

    }

  }

 

  public static void main(String[] arg ){

    java4studentsCB frame = new java4studentsCB();

    frame.setSize(400, 300);

    frame.createGUI();

    frame.setVisible(true);

  }

 

  private void createGUI(){

    setDefaultCloseOperation(EXIT_ON_CLOSE);

    Container window = getContentPane();

    window.setLayout(new FlowLayout() );

    panel=new MyPanel();

    panel.setPreferredSize(new Dimension(300, 200));

    panel.setBackground(Color.white);

    window.add(panel);

    button = new JButton("Press me");

    window.add(button);

    button.addActionListener(this);

  }

  public void actionPerformed(ActionEvent event){

    drawLineEnabled=true;

    panel.repaint();

  }

}