Swing: JSlider wird nicht angezeigt

Status
Nicht offen für weitere Antworten.

Hutmacher

Bekanntes Mitglied
Nachdem ich alle AWT-Kapitel in meinem Buch durch bin, widme ich mich jetzt endlich Swing :).

Zum Testen wollte ich mal den JSlider ausprobieren, also diese Scrollbars mit Skala.
Mein Code setzt 2 JSlider auf ein Frame. Der rechte Schieber symbolisiert dabei die Width eines Rechtecks und der untere Schieber die Height. Diese Rechteck, was auf dem Bildschirm ausgegeben wird, soll also von den JSlidern abhängig sein
(heißt also, dass immer, wenn der Wert von diesen verändert wird, auch der Wert des Rechtecks verändert wird).

Java:
package tests.gui;

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

@SuppressWarnings("serial")
public class SlideTest 
 extends JFrame
 implements ChangeListener
{
	private JSlider   WidthSlider = new JSlider(JSlider.VERTICAL, 0, 100, 0); //Der rechte Width-Schieberegler
	private JSlider   HeightSlider = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); //Der untere Height-Schieberegler
	private Rectangle rect    = new Rectangle(35, 35, 0, 0); //Das zu zeichnende Rechteck
	
	public SlideTest()
	{
		super("Slide-Test!");
		setSize(400, 300);
		setResizable(false);
		
		//WidthSlider-Initialisierungen
		WidthSlider.setMajorTickSpacing(50);
		WidthSlider.setMinorTickSpacing(10);
		WidthSlider.setPaintLabels(true);
		WidthSlider.setPaintTicks(true);
		
		//HeightSlider-Initialisierungen
		HeightSlider.setMajorTickSpacing(50);
		HeightSlider.setMinorTickSpacing(10);
		HeightSlider.setPaintLabels(true);
		HeightSlider.setPaintTicks(true);
		
		//Listener registrieren
		WidthSlider.addChangeListener(this);
		HeightSlider.addChangeListener(this);
		
		//Adden
		Container cp = getContentPane();
		cp.add(WidthSlider, BorderLayout.EAST);
		cp.add(HeightSlider, BorderLayout.SOUTH);
	
		//Fenster anzeigen
		setVisible(true);
	}
	
	@Override
	public void stateChanged(ChangeEvent event)
	{
		JSlider slider = (JSlider)event.getSource();
		if (slider == WidthSlider)
		{
			rect.width = slider.getValue();
		}
		else if (slider == HeightSlider)
		{
			rect.height = slider.getValue();
		}
		
		repaint();
	}

	public void paint(Graphics g)
	{
		g.drawRect(rect.x, rect.y, rect.width, rect.height);
	}

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

Jetzt aber das Problem:
Erstens wird mir nur der rechte, der Width-Slider angezeigt
8xg4v4sd.jpg

und zweitens buggt dieser auch noch irgendwie rum ...
18syrnh8.jpg


Kann mir jemand sagen, was ich falsch mache?
 

sayang

Aktives Mitglied
Hi,

du überschreibst mit paint(Graphics g) die paint-Methode des ContentPanes des JFrames. Und zwar nur mit dem Zeichnen des Rechtecks, welches zu Beginn der Ausführung eine größe von 0 hat.

Der ContentPane enthält jedoch noch die Slider, welche bei der Ausführung von Paint quasi weggeschmissen werden.

Mach doch ein JPanel, welches du in BorderLayout.CENTER setzt. Und statt repaint() rufst du eine eigene Methode paintRect() oder so auf. Diese Methode malt mit dem Graphics-Objekt des JPanels das Rechteck auf das Panel drauf.

Ungefähr so:
Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
 
@SuppressWarnings("serial")
public class SlideTest 
 extends JFrame
 implements ChangeListener
{
    private JSlider   WidthSlider = new JSlider(JSlider.VERTICAL, 0, 100, 0); //Der rechte Width-Schieberegler
    private JSlider   HeightSlider = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); //Der untere Height-Schieberegler
    private Rectangle rect    = new Rectangle(35, 35, 0, 0); //Das zu zeichnende Rechteck
    private JPanel panel = new JPanel(); // Das Panel, auf dem das Rechteck gemalt wird
    private Color backgroundColor = Color.white; // Hintergrundfarbe des Panels
    private Color foregroundColor = Color.black; // Vordergrundfarbe des Panels
    
    public SlideTest()
    {
        super("Slide-Test!");
        setSize(400, 300);
        setResizable(false);
        
        //WidthSlider-Initialisierungen
        WidthSlider.setMajorTickSpacing(50);
        WidthSlider.setMinorTickSpacing(10);
        WidthSlider.setPaintLabels(true);
        WidthSlider.setPaintTicks(true);
        
        //HeightSlider-Initialisierungen
        HeightSlider.setMajorTickSpacing(50);
        HeightSlider.setMinorTickSpacing(10);
        HeightSlider.setPaintLabels(true);
        HeightSlider.setPaintTicks(true);
        
        //Listener registrieren
        WidthSlider.addChangeListener(this);
        HeightSlider.addChangeListener(this);
        
        panel.setBackground(backgroundColor);
//        panel.setForeground(foregroundColor);
        
        //Adden
        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        cp.add(WidthSlider, BorderLayout.EAST);
        cp.add(HeightSlider, BorderLayout.SOUTH);
        cp.add(panel, BorderLayout.CENTER); // Panel auf CENTER legen
        //Fenster anzeigen
        setVisible(true);
        
    }
    
    public void stateChanged(ChangeEvent event)
    {
        JSlider slider = (JSlider)event.getSource();
        
        clearRect();
        
        if (slider == WidthSlider)
        {
            rect.width = slider.getValue();
        }
        else if (slider == HeightSlider)
        {
            rect.height = slider.getValue();
        }
        
        paintRect();
    }
    
    // erstmal das alte Rechteck "löschen"
    public void clearRect() {
    	Graphics g = panel.getGraphics();
    	g.setColor(backgroundColor);
    	g.drawRect(rect.x, rect.y, rect.width, rect.height);
    }
    
    // statt paint(Graphics g), zum zeichnen des neuen Rechtecks
    public void paintRect()
    {
    	Graphics g = panel.getGraphics();
    	g.setColor(foregroundColor);
    	g.drawRect(rect.x, rect.y, rect.width, rect.height);
    }
 
    public static void main(String[] args)
    {
        new SlideTest();
    }
}

Hier gibts 2 neue Methoden clearRect und paintRect. Was clearRect macht, kannst du ja mal ausprobieren, wenn du es in deiner stateChanged-Methode NICHT aufrufst.

Die Abfrage, welcher Slider das stateChanged auslöst, ist übrigens überflüssig. Setz einfach den aktuellen Wert des HeightSliders auf rect.height und den aktuellen Wert des WidthSliders auf rect.width - egal was passiert :)
Java:
public void stateChanged(ChangeEvent event) {
   clearRect();
   rect.width = slider.getValue();
   rect.height = slider.getValue();
   paintRect();
}

Lg
sayang
 

SebiB90

Top Contributor
Man sollte aber generell lieber nicht mit getGraphics arbeiten.
Erstell lieber eine Unterklasse von JPanel und in der überschreibst du die paintComponent Methode, in der du dann zeichnest.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J SWING UI Designer und zeichnen Java Basics - Anfänger-Themen 4
G Maven Swing: Wie verwende ich WindowListener ? Java Basics - Anfänger-Themen 2
C Threads und Swing Java Basics - Anfänger-Themen 9
A Swing: Raumshiff Java Basics - Anfänger-Themen 3
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
nbergmann Wo ist javax.swing.JOptionPane gespeichert? Java Basics - Anfänger-Themen 4
StevenGG Java swing "New Integer" Java Basics - Anfänger-Themen 5
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
O ImageIcon, Swing Java Basics - Anfänger-Themen 1
O Swing JPanel Java Basics - Anfänger-Themen 4
F Swing - Fehler - Paint Methode Java Basics - Anfänger-Themen 7
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
M Wie kann ich hier ein Textfeld hinzufügen Java Swing? Java Basics - Anfänger-Themen 1
M SpielMenü mit Swing Java Basics - Anfänger-Themen 3
M Wie kann ich eine Eingabe im Java-Swing übergeben? Java Basics - Anfänger-Themen 1
N javax swing JOptionPane Hilfe Java Basics - Anfänger-Themen 3
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
C Der Swing Layout-Manager hasst mich Java Basics - Anfänger-Themen 4
M Java swing im Browser starten Java Basics - Anfänger-Themen 0
M JavaFX in Swing-Applikationen einbetten Java Basics - Anfänger-Themen 5
Z Threads SWING mit EventQueue.invokeLater Java Basics - Anfänger-Themen 1
P JDK installieren javac behauptet Javax.swing existiert nicht Java Basics - Anfänger-Themen 8
K Ascii Converter mit Swing Java Basics - Anfänger-Themen 4
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
N Erste Schritte Karte in SWING Application Java Basics - Anfänger-Themen 4
D Mehrfacherfassung in Swing GUI Java Basics - Anfänger-Themen 12
D Datum aus Swing in MySQL DB speichern Java Basics - Anfänger-Themen 22
R warum kann System.out.println(..) etwas, was Swing-Elemente Nicht können ? Java Basics - Anfänger-Themen 11
J Input/Output Charset Swing- Eingaben? Java Basics - Anfänger-Themen 8
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
B Swing intstalliert Eclips{}, mackiert Rot Java Basics - Anfänger-Themen 6
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
B Java Swing "Zeichenfläche" Java Basics - Anfänger-Themen 1
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Platzieren von Komponenten in Swing Applet funktioniert nicht Java Basics - Anfänger-Themen 3
P Hintergrundbild in Swing einfügen Java Basics - Anfänger-Themen 3
C Swing frage Java Basics - Anfänger-Themen 8
T Rechenprogramm mit Swing Java Basics - Anfänger-Themen 3
K Swing Darstellungsproblem Java Basics - Anfänger-Themen 11
G Verständnisproblem mit swing Java Basics - Anfänger-Themen 6
P Swing - Blackscreen Java Basics - Anfänger-Themen 10
Y Random-Objekt und Swing Java Basics - Anfänger-Themen 4
M Klassen Hilfe bei SWING Java Basics - Anfänger-Themen 5
S GUI Problem: Swing Java Basics - Anfänger-Themen 8
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
B Erste Schritte Primefaces -> Swing Gui Java Basics - Anfänger-Themen 7
T Swing, SWT oder JavaFX Java Basics - Anfänger-Themen 8
S Programmoberfläche mit Java-Swing - Herangehensweise Java Basics - Anfänger-Themen 20
E Fragen zu paintXXX in Swing Java Basics - Anfänger-Themen 7
D Erste Schritte bash-Befehl mit Swing ausführen Java Basics - Anfänger-Themen 8
A Alternative zum manuellen Swing programmieren?? Java Basics - Anfänger-Themen 4
S Android fuer Swing-Kenner..? Java Basics - Anfänger-Themen 6
J Swing Timer Java Basics - Anfänger-Themen 3
B Seltsamer Fehler in SWING anwendung Java Basics - Anfänger-Themen 2
D GPS Tracker Swing Java Basics - Anfänger-Themen 2
L Erste Schritte Swing oder SWT Paint mit Grafikkarte? Java Basics - Anfänger-Themen 7
B Einstieg in swing GUI Java Basics - Anfänger-Themen 7
S Swing Eingabe Erzwingen Java Basics - Anfänger-Themen 3
S Swing JTable Java Basics - Anfänger-Themen 7
Z Input/Output Programm mit Swing umsetzen Java Basics - Anfänger-Themen 6
K Eclipse wie Swing per Drag und Drop erstellen Java Basics - Anfänger-Themen 2
V Dropdown Button in einer GUI (Java Swing) Java Basics - Anfänger-Themen 12
S Swing, Gridbaglayout Panel in Panel;funzt nicht!! Java Basics - Anfänger-Themen 3
O swing komponenten werden nicht angezeigt Java Basics - Anfänger-Themen 6
S Swing, Panel über Hintergrundbild!! Java Basics - Anfänger-Themen 6
P Im Fenster bleiben (swing) Java Basics - Anfänger-Themen 16
M Einfacher Swing Wizard Java Basics - Anfänger-Themen 3
E Swing FileWrite?? Java Basics - Anfänger-Themen 3
S Umlaute in Swing-GUI Java Basics - Anfänger-Themen 8
K Drop-down Menü (swing) Java Basics - Anfänger-Themen 4
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
M Swing Klasse auch per Kommandozeile starten? Java Basics - Anfänger-Themen 2
S JAVA Swing Eventlistener Java Basics - Anfänger-Themen 11
P Swing - Welche Klasse für ausgeben von Ergebnissen? Java Basics - Anfänger-Themen 3
V Swing Componenten werden auf Mac nicht angezeigt Java Basics - Anfänger-Themen 19
J Überfordert mit Swing Java Basics - Anfänger-Themen 5
B Baum > Baum-Swing Java Basics - Anfänger-Themen 4
B Bei Swing weg vom North-West-South-East-Prinzip Java Basics - Anfänger-Themen 2
K Swing Fenster jede sec.neuzeichnen Java Basics - Anfänger-Themen 14
F Werteübergabe in Swing Formularen (gui Builder) Java Basics - Anfänger-Themen 9
L Swing GridBagLayout Java Basics - Anfänger-Themen 3
K Bild als Hintergrund in einem Swing Fenster Java Basics - Anfänger-Themen 21
J unterschied zwischen awt und swing Java Basics - Anfänger-Themen 6
C Swing i.V.m. Threads Java Basics - Anfänger-Themen 2
J XML Viewer for Swing Java Basics - Anfänger-Themen 6
Y Anfänger Hausaufgabe... Swing Java Basics - Anfänger-Themen 6
W Zeichnen in Swing Java Basics - Anfänger-Themen 7
B Swing Applikation mit mehreren Klassen Java Basics - Anfänger-Themen 2
C Swing, Buttons Wert zuweisen Java Basics - Anfänger-Themen 3
Luk10 Swing timer und Threads Java Basics - Anfänger-Themen 4
J Java GUI in Swing und das MVC Paradigma Java Basics - Anfänger-Themen 3
M Swing Java Basics - Anfänger-Themen 7
B Verständnisproblem zu Swing und Methoden Java Basics - Anfänger-Themen 8

Ähnliche Java Themen


Oben