import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Stapel extends JPanel { private static final Color BACKGROUND = Color.BLACK; private static final Color FOREGROUND = Color.RED; private boolean vertical; private double percent; public Stapel(boolean vertical) { this.vertical = vertical; this.percent = 0; } public void setPercent(int percent) { if (percent < 0 || percent > 100) { throw new IllegalArgumentException("Percent must be at least 0 and at most 100."); } this.percent = percent; repaint(); // glöm ej!! } public void paintComponent(Graphics g) { super.paintComponent(g); // Nedanstående kan göras betydligt snyggare - upprepade beräkningar // förekommer exempelvis. Obs att jag blandat ihop vertikalt och // horisontellt nedan. if (vertical) { g.setColor(FOREGROUND); g.fillRect(0,0,(int)(0.01*percent*getWidth()),getHeight()); g.setColor(BACKGROUND); g.fillRect((int)(0.01*percent*getWidth()),0,getWidth() - (int)(0.01*percent*getWidth()), getHeight()); } else { g.setColor(FOREGROUND); g.fillRect(0,getHeight() - (int)(0.01*percent*getHeight()),getWidth(), (int)(0.01*percent*getHeight())); g.setColor(BACKGROUND); g.fillRect(0,0,getWidth(),getHeight()-(int)(0.01*percent*getHeight())); } } // main-metod ingick inte i uppgiften. Nedanstående är dock bra att förstå! public static void main(String[] args) throws InterruptedException{ JFrame frame = new JFrame(); // st och st2 är final eftersom de ska användas av en lokal (och anonym) // klass nedan. Kompilerar ej annars. final Stapel st = new Stapel(true); final Stapel st2 = new Stapel(false); st.setPreferredSize(new Dimension(200,50)); st2.setPreferredSize(new Dimension(200,50)); frame.add(st, BorderLayout.CENTER); frame.add(st2, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Inte gått igenom detta ännu: anonyma klasser. Nedan deklarerar vi // en klass som implementerar ActionListener-interfacet och instansierar // samtidigt ett objekt av klassen. Klassen kan inte återanvändas. Timer timer = new Timer(1000, new ActionListener() { //instansvariabler som i "vanliga" klasser int percent = 0; int INCREASE = 10; public void actionPerformed(ActionEvent e) { st.setPercent(percent = (percent + INCREASE) % 100); st2.setPercent(percent); } }); timer.setRepeats(true); timer.start(); } }