Swing Slider mit Value Auswertung wird nicht angezeigt

Semox

Bekanntes Mitglied
Hallo Forum

Ich mache gerade ein Programm, das so aussehen soll wie auf den Screenshot, den ich angehängt habe. Ich habe schon einiges geschrieben, nur leider werden trotz add-Anweisung die Elemente nicht dargestellt. Welcher Layout-Manager würde dafür gantz gut passen? Ich dachte ich entscheide mich laut Sun-Tutorial für das GridLayout. Was fehlt denn da bloß, daß ich meinen Kram nicht dargestellt bekomme?

Java:
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.util.Random;

import java.awt.GridLayout;
import java.awt.Scrollbar;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class HinzKunz extends JFrame implements AdjustmentListener {

	private static final long serialVersionUID = 7097430302543101130L;
	private Random r = new Random();
	private int hinz = 50;
	private int kunz = 50;

	private void HinzKunz() {
		this.setSize(400, 250);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("Hinz und Kunz");
		JPanel panel = new JPanel(new GridLayout());
		this.getContentPane().add(panel);

		Scrollbar hinz_sb = new Scrollbar(Scrollbar.HORIZONTAL);
		Scrollbar kunz_sb = new Scrollbar(Scrollbar.HORIZONTAL);

		panel.add(hinz_sb);
		panel.add(kunz_sb);

		hinz_sb.addAdjustmentListener(this);
		kunz_sb.addAdjustmentListener(this);

		this.pack();
		this.setVisible(true);

	}

	public void adjustmentValueChanged(AdjustmentEvent adjE) {
		if (adjE.getSource() == hinz_sb)
			hinz = hinz_sb.getValue;
		if (adjE.getSource() == kunz_sb)
			kunz = kunz_sb.getValue();
		repaint();
	}

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

	}

}

Danke für Eure Zeit.

Viele Grüße,
Semo
 

Tobias

Top Contributor
So, jetzt aber:

Für das, was du vorhast, gibt es eine Extrakomponente, den JSlider. Mit dem wird es gehen.

JScrollBars sind dazu da, um Inhalte, die nicht ins Anzeigefenster passen, erreichbar zu machen.
 
Zuletzt bearbeitet:
Genau und ich würde dir empfehlen die beiden JSlider in ein Panel zu packen.
Dann den unteren Teil auch in eines packen und anschließend beide zusammen in die contentPane legen.
Dazu kannste eigentlich problemlos FlowLayout nehmen, musst nur auf die Größe der Panels achten, dass die auch untereinander sind. Beim GridLayout werden die Abstände so starr. Ich persönlich mag das nicht, aber das ist ja ne Geschmacksfrage..
 

Semox

Bekanntes Mitglied
Hallo

Ich komme nicht weiter... Der Code ist nun etwas angepaßt- Ich habe mich dabei versucht an das Tutorial von Sun zu halten. Jedoch werden die Componenten nicht angezeigt. Ich bitte um Eure Hilfe.

[Java]
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class HinzKunz extends JFrame implements ChangeListener {

private static final long serialVersionUID = 7097430302543101130L;
private int hinz = 50; // SliderVal (Start) fuer hinz
private int kunz = 50; // SliderVal (Start) fuer kunz
JSlider hinz_sb;
JSlider kunz_sb;
String str = "Huhu";
JLabel jL = new JLabel(str);

private void HinzKunz() {
this.setSize(400, 250);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Hinz und Kunz");
JPanel panel = new JPanel(new FlowLayout());
this.getContentPane().add(panel, FlowLayout.LEFT);

JSlider hinz_sb = new JSlider(JSlider.HORIZONTAL, 0, 255, hinz);
JSlider kunz_sb = new JSlider(JSlider.HORIZONTAL, 0, 255, kunz);

panel.add(hinz_sb);
panel.add(kunz_sb);

hinz_sb.addChangeListener(this);
kunz_sb.addChangeListener(this);
panel.add(jL);
this.pack();
this.setVisible(true);

}

public void stateChanged(ChangeEvent cE) {
if (cE.getSource() == hinz_sb)
hinz = hinz_sb.getValue();
if (cE.getSource() == kunz_sb)
kunz = kunz_sb.getValue();
if (hinz == kunz)
str = "Hinz und Kunz sind gleich gross";
if (hinz > kunz)
str = "Hinz ist groesser als Kunz.";
if (hinz < kunz)
str = "Kunz ist groesser als Hinz.";
repaint();
}

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

}

}

[/Java]

Viele Grüße,
Semo
 

javimka

Top Contributor
Das FlowLayout wird für deine Zwecke wahrscheinlich ungenügend sein, weil es dir sehr wenig Kontrolle über die Anordnung der Komponenten überlässt. Besser wäre wahrscheinlich ein GridBagLayout oder TableLayout oder eine Kombination vieler anderer Layouts.
 

Semox

Bekanntes Mitglied
Konstruktoren haben keinen Rückgabewert. Auch nicht void.

Hallo Tobias

Natürlch hast Du recht. Deswegen habe ich den Code etwas verändert...

[Java]
(...)
String vergleichen = "";
String str = "Huhu";
JLabel jL = new JLabel(str);

private void HinzKunz() {
(...)
JPanel panel = new JPanel(new FlowLayout());
this.getContentPane().add(panel, FlowLayout.LEFT);

JSlider hinz_sb = new JSlider(JSlider.HORIZONTAL, 0, 255, hinz);
JSlider kunz_sb = new JSlider(JSlider.HORIZONTAL, 0, 255, kunz);

panel.add(hinz_sb);
panel.add(kunz_sb);

hinz_sb.addChangeListener(this);
kunz_sb.addChangeListener(this);
panel.add(jL);
this.pack();
this.setVisible(true);

}

public void stateChanged(ChangeEvent cE) {
if (cE.getSource() == hinz_sb)
hinz = hinz_sb.getValue();
if (cE.getSource() == kunz_sb)
kunz = kunz_sb.getValue();
vergleichen = compareVal();
repaint();
}

public String compareVal() {
if (hinz < kunz)
str = "Kunz ist groesser als Hinz.";
else if (hinz > kunz)
str = "Hinz ist groesser als Kunz.";
else
str = "Hinz und Kunz sind gleich gross";
return str;
}
[/Java]

Jetzt wird auch etwas Sinnvolles zurückgegeben. Aber ich habe keine Ahnung, wie ich das nun anzeigen lassen kann... Was fehlt denn da bloß?

Gruß,
Semo
 

Semox

Bekanntes Mitglied
Hallo

Habe nun weiter am GridBagLayout Satz der Komponenten gearbeitet. Wie bekommt man denn eigentllich ein Rechteck auf die Bühne gezeichnet? Swing kennt scheinbar kein Rechteck. Ich weiß nicht so recht wie man das nun mitten innerhalb des Containers gbc auf den JPanel panel einbaut. Kann mir jemand bitte sagen, wie das funktioniert?
:bahnhof:

Vielen Dank.

[Java]
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class HinzKunz extends JFrame implements ChangeListener {

private static final long serialVersionUID = 7097430302543101130L;

// Start Wert fuer die Slider
private static int hinz = 50;
private static int kunz = 50;

JSlider hinz_sb;
JSlider kunz_sb;
static String vergleichen = "";
static String str = "";

static String jL_hinz = "Hinz: ";
static String jL_hinz_1 = "Hinz: ";
static String jL_kunz = "Kunz: ";
static String jL_kunz_1 = "Kunz: ";
JLabel jL = new JLabel(str);

// Methode schubst die ganzen Komponenten auf die Stage
public static void addComponentsToPanel(Container panel) {
panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);

panel.setSize(640, 480);
panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;

JLabel jL_h = new JLabel(jL_hinz);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.5;
gbc.gridx = 1;
gbc.gridy = 0;
panel.add(jL_h, gbc);


final JSlider hinz_sb = new JSlider(JSlider.HORIZONTAL, 0, 255, hinz);
hinz_sb.setPaintTicks(true);
hinz_sb.setMinorTickSpacing(10);
hinz_sb.setMajorTickSpacing(20);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.5;
gbc.gridx = 2;
gbc.gridy = 0;
panel.add(hinz_sb, gbc);

JLabel jL_k = new JLabel(jL_kunz);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.5;
gbc.gridx = 3;
gbc.gridy = 0;
panel.add(jL_k, gbc);

final JSlider kunz_sb = new JSlider(JSlider.HORIZONTAL, 0, 255, kunz);
kunz_sb.setPaintTicks(true);
kunz_sb.setMinorTickSpacing(10);
kunz_sb.setMajorTickSpacing(20);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.5;
gbc.gridx = 4;
gbc.gridy = 0;
panel.add(kunz_sb, gbc);

JLabel jL_h_1 = new JLabel(jL_hinz);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 3;
panel.add(jL_h_1, gbc);

//HIER IST MEIN PROBLEM
panel.fillRect(80, 110, hinz * 2, 10);

JLabel jL_k_1 = new JLabel(jL_kunz);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 4;
panel.add(jL_k_1, gbc);

//HIER EBENDA
panel.fillRect(80, 110, kunz * 2, 10);

ChangeListener l = new ChangeListener() {

public void stateChanged(ChangeEvent cE) {
if (cE.getSource() == hinz_sb)
hinz = hinz_sb.getValue();
if (cE.getSource() == kunz_sb)
kunz = kunz_sb.getValue();
vergleichen = compareVal();

}
};

hinz_sb.addChangeListener(l);
kunz_sb.addChangeListener(l);
}

// Werte vergleichen und JLabel neu belegen
public static String compareVal() {
if (hinz < kunz)
str = "Kunz ist groesser als Hinz.";
else if (hinz > kunz)
str = "Hinz ist groesser als Kunz.";
else
str = "Hinz und Kunz sind gleich gross";
return str;
}

public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub

}

private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("Hinz und Kunz");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Set up the content
addComponentsToPanel(frame.getContentPane());

// Display the window.
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {

javax.swing.SwingUtilities.invokeLater(new Runnable() { public void
run() { createAndShowGUI(); } });

}
}
[/Java]

Macht man das über einen paint g Methode, die dann in "void addComponentsToPanel" per super() geerbt wird?

EDIT: Habe nun versucht das mittels des folgenden Codes zu lösen. Bin ich da auf dem richtigen Weg?

Hinzugefügt:
[JAVA=38]
public static void addComponentsToPanel(Container panel, Graphics g) {
[/code]
[Java=88]
panel.paint(g);
[/code]
[JAVA=89]
g.fillRect(80, 110, kunz * 2, 20);
[/code]
[JAVA=137]
addComponentsToPanel(frame.getContentPane(), g);
[/code]

Leider bekomme ich da eine NullPointerException... Mit welchem Wert könnte ich g initialisieren, um das zu verhindern?

Gruß,
Semo
 
Zuletzt bearbeitet:

javimka

Top Contributor
Was für ein g hast du denn da übergeben, das ist doch sicher null gewesen.

Aber es wäre sowieso der falsche Ansatz. Du musst eine neue Komponente basteln, die das Rechteck für dich zeichnet:
Java:
public class PnlRectangle extends JPanel {
	
	private int kunz;
	
	public PnlRectangle(int kunz) {
		this.kunz = kunz;
	}
	
	@Override
	public Dimension getPreferredSize() {
		return new Dimension(80+kunz*2, 110+20);
	}
	
	@Override
	public Dimension getMinimumSize() {
		return getPreferredSize();
	}
	
	@Override
	public void paintComponent(Graphics g) {
		g.setColor(Color.BLACK);
		g.fillRect(80,110,kunz*2,20);
	}
}

Vielleicht musst du die Methode getPreferredSize noch ein bisschen anpassen, um die richtige Grösse für diese Komponente zu finden. Das GridBagLayout berücksichtigt übrigens nur die MinumumSize, deshalb muss die für deinen Fall unbedingt überschrieben werden.
Weil die Grösse des Rechtecks von kunz abhängt, musst du diese Variable dem Konstruktor übergeben.
 

Semox

Bekanntes Mitglied
Hello Again,

Die Funktionalität des Programms ist fertig, alle Komponenten sind plaziert, jedoch werden sei nicht angezeigt. Das alte Problem mit dem AWT-Sachen habe ich in eine externe Klasse ausgelagert. Somit werden (sollten) die Balken per paintComponent (Graphics g) gezeichnet (werden). Der Compiler hat nichts zu meckern und auch sonst sieht alles gut aus.

Könnte mir bitte jemand sagen, warum sich der Balken nicht zeigen läßt? Das wäre wirklich nett... Ich habe dazu die Klassen in eine ZIP in den Anhang gepackt...

Beste Grüße,
Semo
 

Semox

Bekanntes Mitglied
Hallo

Ich habe weiter herumprobiert, aber leider kein Ergebnis erzielt. Das fillRect aus der separaten Klasse HKLabel.java wollte ich per paintComponent im GridBagLayout unterbringen.

Die Dateien sind im vorhergehenden Post zu finden.

Hier ist ein Ausschnitt aus HKLabel:

Java:
	public HKLabel(int hinz, int kunz) {
		hinz_n = hinz;
		kunz_n = kunz;
	}

        //zwei Setter
	public void setHinz_n(int hinz_n) {
		this.hinz_n = hinz_n;
	}

	public void setKunz_n(int kunz_n) {
		this.kunz_n = kunz_n;

	}

	@Override
	public void paintComponent(Graphics g) {

		g.drawString(str, 20, 100);
		g.setColor(Color.RED);
		g.fillRect(80, 110, kunz_n * 2, 20);
		g.setColor(Color.YELLOW);
		g.fillRect(80, 140, hinz_n * 2, 20);
		g.fillRect(100, 300, 600, 20);

		System.out.println("Ich bin da" + " " + hinz_n + " " + kunz_n);
	}
}

In der Hauptklasse HinzKunz habe ich ein Objekt hkl erzeugt und dann das dem einzigen Container panel zugeordnet... Hier ist der betreffende Teil:

Java:
[...]

public class HinzKunz extends JFrame implements ChangeListener {

	private static final long serialVersionUID = 7097430302543101130L;

	private int hinz = 50;
	private int kunz = 50;

[...]

	HKLabel hkl = new HKLabel(hinz, kunz);

	public void addComponentsToPanel(Container panel) {

		String jL_kunz = "Kunz: ";
		String jL_hinz = "Hinz: ";

		panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		
		panel.setSize(640, 300);
	
		panel.setLayout(new GridBagLayout());

		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.HORIZONTAL;
		
		JLabel jL_h = new JLabel(jL_hinz);
		gbc.fill = GridBagConstraints.HORIZONTAL;
		Dimension minSize = new Dimension(5, 10);
		Dimension prefSize = new Dimension(5, 20);
		Dimension maxSize = new Dimension(Short.MAX_VALUE, 50);
		panel.add(new Box.Filler(minSize, prefSize, maxSize));
		gbc.weightx = 0.5;
		gbc.gridx = 1;
		gbc.gridy = 0;
		panel.add(jL_h, gbc);

[...]
               //dieses Label wird gezeigt
		JLabel jL_k_1 = new JLabel(jL_kunz);
		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.gridx = 0;
		gbc.gridy = 4;
		panel.add(jL_k_1, gbc);

               //das leider nicht
		gbc.fill = GridBagConstraints.CENTER;
		gbc.gridx = 1;
		gbc.gridy = 5;
		panel.add(hkl, gbc);

	}

	[...]

	private void createAndShowGUI() {
		// Create and set up the window.
		JFrame frame = new JFrame("Hinz und Kunz");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Set up the content
		addComponentsToPanel(frame.getContentPane());

		// Display the window.
		frame.pack();
		frame.setVisible(true);
	}
[...]

Unter anderem habe ich ein zweites Panel angemeldet und dem auch das GridBagLayout zugeordnet. Dann mit den gleichen Werten wie aus dem ersten Panel aufgerufen und schließlich per
Code:
panel2.add(hkl, gbc)
versucht anzeigen zu lassen, aber trotzdem kam nichts.

Siehe Screenshot...

Weiß jemand was falsch ist bzw. fehlt, daß die Balken aus der HKLabel Klasse nicht in der HinzKunz Klasse gemalt werden? Ich finde einfach keinen Weg... Danke Euch!

Viele Grüße
Semo
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JavaFX Slider soll Value erst ab einer bestimmten Bedinung aendern AWT, Swing, JavaFX & SWT 19
A Swing Slider-Value auslesen und weitergeben AWT, Swing, JavaFX & SWT 4
J Swing Slider AWT, Swing, JavaFX & SWT 11
B Slider-Wert an anderen Slider übergeben AWT, Swing, JavaFX & SWT 5
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
G JavaFX Slider in JavaFX beide Seiten beschriften AWT, Swing, JavaFX & SWT 2
S Swing Customised Slider AWT, Swing, JavaFX & SWT 2
J Slider Wert anzeigen AWT, Swing, JavaFX & SWT 15
C Slider für Zeitauswahl AWT, Swing, JavaFX & SWT 3
A Slider soll einen Wert übergeben AWT, Swing, JavaFX & SWT 1
L ComboBox: slider positionieren AWT, Swing, JavaFX & SWT 0
H org.eclipse.swt.Slider ohne Buttons AWT, Swing, JavaFX & SWT 1
H org.eclipse.swt.widgets.Slider und negative Werte AWT, Swing, JavaFX & SWT 3
H SWT - DataBinding - observerMax für Slider AWT, Swing, JavaFX & SWT 1
G 2D-Slider bzw. eine graphische Auswahlkomponente die sich so verhält AWT, Swing, JavaFX & SWT 6
A Slider (JSlider?) AWT, Swing, JavaFX & SWT 7
B runder Slider AWT, Swing, JavaFX & SWT 3
D Audio Player Progress Slider nicht flüssig AWT, Swing, JavaFX & SWT 2
O Verbesserungfrage zu einem MP3Player Slider - Ebenius kannst du helfen bitte ? AWT, Swing, JavaFX & SWT 10
G Slider, der naja schwer zu sagen. AWT, Swing, JavaFX & SWT 15
M slider soll keine zwischenwerte annehmen AWT, Swing, JavaFX & SWT 2
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
P JavaFX Key-Value-Paar auf TreeItem ermitteln AWT, Swing, JavaFX & SWT 6
N JavaFX TreeItem: Value-Binding AWT, Swing, JavaFX & SWT 1
J CheckTreeView mit eigenem Cell Value AWT, Swing, JavaFX & SWT 3
U Swing Jtable cells value editable AWT, Swing, JavaFX & SWT 1
G Swing Value von einer JScrollBar auf eine andere übertragen AWT, Swing, JavaFX & SWT 2
T jSlider-Value als Float in jLabel ausgeben AWT, Swing, JavaFX & SWT 2
O Swing JSlider mit doppelter Value AWT, Swing, JavaFX & SWT 6
C Value eines RadioButtons ausgeben AWT, Swing, JavaFX & SWT 6
S SWT ProgressBar: Value/Selection anzeigen AWT, Swing, JavaFX & SWT 4
J Swing JXTable, vom CellRenderer gerendertes Value holen. AWT, Swing, JavaFX & SWT 5
G Value vom TreeCellEditor ist immer null AWT, Swing, JavaFX & SWT 3
O ScrollBar.setValue(int value); ? AWT, Swing, JavaFX & SWT 3
L Jcombobox + value Wert AWT, Swing, JavaFX & SWT 7
L JTable SelectRowByValue(Object Value)? AWT, Swing, JavaFX & SWT 3
L Button ändert eigenes Bild und Progressbar-Value nicht AWT, Swing, JavaFX & SWT 6
M erstes Frame wartet auf die Auswertung eines zweiten AWT, Swing, JavaFX & SWT 8
D PropertyChangeListener Event auswertung AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben