Faculté des Sciences de Luminy
Programmation Orientée Objets, langage Java
 
Henri Garreta

Exo 5

Voici le fichier SystemeVisible.java correspondant à une version Swing du programme demandé (il faut également le fichier SystemeLineaire.java de la série précédente).
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class SystemeVisible extends JFrame implements ActionListener {
    private SystemeLineaire systeme;
    private JTextField champDimension;
    private JTextField champEpsilon;
    private JButton boutonAccepter;
    private JButton boutonTriangulariser;
    private JButton boutonResoudre;
    private JTextArea vueMatrice;
    private boolean vueModifiee;

    public SystemeVisible() {
        super("Système linéaire");

        champDimension = new JTextField(4);
        champDimension.addActionListener(this);
        
        champEpsilon = new JTextField(4);
        champEpsilon.addActionListener(this);
        
        boutonAccepter = new JButton("Accepter");
        boutonAccepter.addActionListener(this);
        boutonAccepter.setEnabled(false);
        
        boutonTriangulariser = new JButton("Triangulariser");
        boutonTriangulariser.addActionListener(this);
        boutonTriangulariser.setEnabled(false);

        boutonResoudre = new JButton("Resoudre");
        boutonResoudre.addActionListener(this);
        boutonResoudre.setEnabled(false);

        JPanel panneau = new JPanel();
        panneau.setBackground(Color.lightGray);
        panneau.add(new JLabel("dim", JLabel.RIGHT));
        panneau.add(champDimension);
        panneau.add(new JLabel("epsilon", JLabel.RIGHT));
        panneau.add(champEpsilon);
        panneau.add(boutonAccepter);
        panneau.add(boutonTriangulariser);
        panneau.add(boutonResoudre);
        add(panneau, BorderLayout.NORTH);

        vueMatrice = new JTextArea();
        vueMatrice.setFont(new Font("Monospaced", Font.PLAIN, 12));
        vueMatrice.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                vueModifiee = true;
                misaJourBoutons();
            }
        });
        add(vueMatrice, BorderLayout.CENTER);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        setSize(500, 400);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == champDimension) {
            try {
                int n = Integer.parseInt(champDimension.getText());
                systeme = new SystemeLineaire(n);
            } catch (Exception exc) {
            }
            if (systeme != null) {
                champDimension.setText("" + systeme.n());
                champEpsilon.setText("" + systeme.epsilon());
            }
        } else if (e.getSource() == champEpsilon) {
            try {
                double eps = Double.parseDouble(champEpsilon.getText());
                systeme.defEpsilon(eps);
            } catch (Exception exc) {
            }
            if (systeme != null)
                champEpsilon.setText("" + systeme.epsilon());
        } else if (e.getSource() == boutonAccepter) {
            StringTokenizer tokens = new StringTokenizer(vueMatrice.getText());
            int n = (int) Math
                    .round((Math.sqrt(1 + 4 * tokens.countTokens()) - 1) / 2);
            systeme = new SystemeLineaire(n);
            champDimension.setText("" + systeme.n());
            champEpsilon.setText("" + systeme.epsilon());

            try {
                for (int i = 0; i < n; i++)
                    for (int j = 0; j <= n; j++) {
                        String tok = tokens.nextToken();
                        tok = tok.replace(',', '.');   // Double.parseDouble accepte "1.5" non "1,5"
                        systeme.setCoef(i, j, Double.parseDouble(tok));
                    }
            } catch (Exception exc) {
            }
            vueModifiee = false;
        } else if (e.getSource() == boutonTriangulariser)
            systeme.triangularisation();
        else
            /* e.getSource() == boutonResoudre */
            systeme.resolution();

        if (systeme != null)
            afficherSysteme();
        misaJourBoutons();
    }

    private void afficherSysteme() {
        ByteArrayOutputStream fluxOctets = new ByteArrayOutputStream();
        systeme.impression(new PrintStream(fluxOctets));
        vueMatrice.setText(fluxOctets.toString());
    }

    void misaJourBoutons() {
        if (vueModifiee) {
            boutonAccepter.setEnabled(true);
            boutonTriangulariser.setEnabled(false);
            boutonResoudre.setEnabled(false);
        } else if (systeme == null
                || systeme.etat() == SystemeLineaire.SINGULIER
                || systeme.etat() == SystemeLineaire.RESOLU) {
            boutonAccepter.setEnabled(false);
            boutonTriangulariser.setEnabled(false);
            boutonResoudre.setEnabled(false);
        } else {
            boutonAccepter.setEnabled(false);
            boutonTriangulariser
                    .setEnabled(systeme.etat() == SystemeLineaire.INITIAL);
            boutonResoudre.setEnabled(true);
        }
    }

    public static void main(String[] args) {
        new SystemeVisible();
    }
}