//Import av nödvändiga klasser import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * IP1 - Uppgift 1b * Ett multitrådat fristående program, som kan köras igång med web start. * 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 JFrame public class Uppgift1b extends JFrame{ private JPanel bottomPanel; private JButton k1, k2; private JTextArea text; private Knapp1 tråd1; private Knapp2 tråd2; private Cursor c = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); //Konstruktor och placering av fönsterkomponenter public Uppgift1b(){ super ("UPPGIFT 1b"); getContentPane().setBackground(Color.gray.darker()); getContentPane().setLayout(new BorderLayout()); addWindowListener(new Close()); 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); //Fönstrets storlek setLocation(200, 180); //Placering på skärmen show(); } //Lyssnare som stänger fönster class Close extends WindowAdapter{ public void windowClosing (WindowEvent we){ System.exit(0); } } //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; } } //Main-metod public static void main(String[] args){ new Uppgift1b(); } }