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();
}
}