/** Initialisiere GUI-Komponenten des ThreadStatusPanels */ public void init() { this.setLayout(new GridLayout(3, 1)); this.setBorder(BorderFactory.createTitledBorder(t.getName())); Dimension d = new Dimension(200, 120); this.setPreferredSize(d); // Labels (Beachtet: Sie bekommen nicht direkt einen Text! Warum? Schaut runter in die // paint()-Methode) labelStatus = new JLabel(); labelInterval = new JLabel(); // Eine neue GUI-Komponente! Der JSlider zum Intuitiven Ändern eines Wertes innerhalb // wohldefinierter Grenzen sliderInterval = new JSlider(); sliderInterval.setMinimum(250); // Kleinstmöglicher Wert sliderInterval.setMaximum(20000); // Größtmöglicher Wert sliderInterval.setMinorTickSpacing(250); // Abstände zwischen Werten (optional) sliderInterval.setSnapToTicks(true); // "Snap" auf diese festen Werte sliderInterval.setValue(t.getInterval()); // Initialer Wert // Button buttonToggle = new JButton("Starten/Anhalten"); // Zusammenbauen this.add(labelStatus); JPanel sub = new JPanel(); sub.setLayout(new GridLayout(1, 2)); sub.add(labelInterval); sub.add(sliderInterval); this.add(sub); this.add(buttonToggle); }
@Override public void paint(Graphics g) { // Aktualisiere die Label-Texte abhängig vom aktuellen Thread-Status labelStatus.setText(this.running ? "LÄUFT" : "WARTET"); labelStatus.setForeground(this.running ? Color.blue : Color.gray); labelInterval.setText(String.format("Intervall: %d ms", t.getInterval())); super.paint(g); }
/** * Re-initialisiert das ThreadStatusPanel. Die beiden gemeinsamen Datenstrukturen werden * mitgegeben, damit die Hilfsmethode zum Erzeugen einer neuen IntervalThread-Instanz direkt die * passenden Referenzen besitzt * * @param schlange * @param portionen * @return */ public IntervalThread reinit(Schlange schlange, Portionen portionen) { // Stoppe den aktuellen Thread this.t.interrupt(); // Erzeuge über eine Hilfsmethode einen neuen IntervalThread newThread = Utils.makeNewIntervalThread(t.getClass(), schlange, portionen); this.t = newThread; // Setze den Zustand auf "nicht laufend" this.running = false; // Zeichne die Komponente neu this.repaint(); // Gib' den neuen Thread zurück (kann in der GUI zurück in die Thread-Map gepackt werden) return newThread; }