//Import av nödvändiga klasser import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.applet.*; /** * IP1 - Uppgift 1a * Ett multitrådat äpple, med ett grafiskt användargränssnitt, * som har två knappar och en text-area. * Respektive tråd skriver ut, en gång per sekund, ett meddelande * i programmets text-area. Trådarna kan aktiveras och deaktiveras * med hjälp av knapparna. * * @author Blanca Larkeson */ //Klassen ärver av JApplet public class Uppgift1a extends JApplet{ private JPanel bottomPanel; private JButton k1, k2; private JTextArea text; private Knapp1 tråd1; private Knapp2 tråd2; private ImageIcon icon; private JLabel label; private Cursor c = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); //Konstruktor och initieringsmetod som anroppas av browsern //Placering av fönsterkomponenter public void init(){ getContentPane().setBackground(Color.gray.darker()); getContentPane().setLayout(new BorderLayout()); icon = new ImageIcon(getImage(getCodeBase(), "line.gif" )); label = new JLabel (icon, SwingConstants.CENTER); getContentPane().add(label, BorderLayout.NORTH); text = new JTextArea(); text.setEditable(false); text.setBackground(new Color(200,200,235)); JScrollPane scroll = new JScrollPane(text); getContentPane().add(scroll, BorderLayout.CENTER); bottomPanel = new JPanel(); bottomPanel.setBackground(Color.gray.darker()); getContentPane().add(bottomPanel, BorderLayout.SOUTH); k1 = new JButton (" Aktivera utskrift från tråd 1 "); k1.setForeground(Color.black); k1.setBorder(BorderFactory.createRaisedBevelBorder()); k1.setCursor(c); k1.addActionListener(new L1()); bottomPanel.add(k1); k2 = new JButton (" Aktivera utskrift från tråd 2 "); k2.setForeground(Color.black); k2.setBorder(BorderFactory.createRaisedBevelBorder()); k2.setCursor(c); k2.addActionListener(new L2()); bottomPanel.add(k2); setSize(420, 300); } //Lyssnare kopplad till knapp 1 class L1 implements ActionListener{ public void actionPerformed (ActionEvent ae){ if (ae.getActionCommand().equals(" Aktivera utskrift från tråd 1 ")){ tråd1 = new Knapp1(text); tråd1.setBoolean(true); tråd1.start(); k1.setText(" Deaktivera utskrift från tråd 1 "); k1.setForeground(Color.red); } else{ k1.setText(" Aktivera utskrift från tråd 1 "); k1.setForeground(Color.black); tråd1.setBoolean(false); tråd1 = null; } } } //Lyssnare kopplad till knapp 2 class L2 implements ActionListener{ public void actionPerformed (ActionEvent ae){ if (ae.getActionCommand().equals(" Aktivera utskrift från tråd 2 ")){ tråd2 = new Knapp2(text); tråd2.statt(); k2.setText(" Deaktivera utskrift från tråd 2 "); k2.setForeground(Color.red); } else{ k2.setText(" Aktivera utskrift från tråd 2 "); k2.setForeground(Color.black); tråd2.stop(); tråd2 = null; } } } //Denna klass ärver från klassen Thread public class Knapp1 extends Thread{ private boolean loop; private JTextArea ta; //Konstruktor public Knapp1(JTextArea t){ ta = t; } //Överskuggning av metoden "run" public void run(){ loop = getBoolean(); while(loop){ ta.append(" Utskrift från tråd 1"+"\n"); ta.setCaretPosition(ta.getText().length()); try{ sleep(1000); } catch(Exception e){} loop = getBoolean(); } } //Hjälpmetod - ändrar värdet på boolean public void setBoolean (boolean b){ loop = b; } //Hjälpmetod - retunerar värdet på boolean public boolean getBoolean(){ return loop; } } //Denna klass implementerar gränssnitet Runnable public class Knapp2 implements Runnable{ private boolean loop; private JTextArea ta; private Thread thread; //Konstruktor public Knapp2(JTextArea t){ thread = new Thread(this); ta = t; thread.start(); } //Implementering av metoden "run" public void run(){ while(loop){ ta.append(" Utskrift från tråd 2"+"\n"); ta.setCaretPosition(ta.getText().length()); try{ thread.sleep(1000); } catch(Exception e){} } } //Hjälpmetod - sätter boolean till true public void statt(){ loop = true; } //Hjälpmetod - sätter boolean till false public void stop(){ loop = false; } } }