Diashow

Status
Nicht offen für weitere Antworten.

Jomama09

Aktives Mitglied
Hallo Leute, habe ein hoffe ich kleines Problem wobei ihr mir helfen könntet.
Ich versuche über ein Drehfeld die Anzeigendauer der Diashow einzustellen.
Bisher hatte das Programm auch gut funktioniert, leider seit ich es mit dem JSpinner
etwas verfeinern wollte haut es nicht mehr hin. ;(
Bekomme einfach den Wert des Drehfeldes nicht korrekt abgefragt, da ich immer den Fehler bekomme ,kann Objekt nicht nach Int wandeln.
Möchte den Wert dann mit einer If Schleife abfragen und so entsprechende Millisekunden für die Diapause Festlegen.

[Java]
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;


public class Bildbetrachter extends JFrame{

//automatisch über Eclipse ergänzt
private static final long serialVersionUID = 5926848670766709720L;

//für die Schaltflächen
private JButton oeffnen, beenden, oeffnenSchau, beendenSchau;
//für die Eingabe
private JTextField eingabe;
//für die Anzeige
private BildPanel bildAnzeige, bildAnzeigeSchau;
//für die Anpassung
private JCheckBox skalieren;
// Drehfeld für die Zeitspanne
private JSpinner zeitschalter;
// Variable für die Sekunden
private int anzeigenDauer;

int sekunden;

//die innere Klasse mit dem Listener
class MeinListener implements ActionListener, ChangeListener {

@Override
public void actionPerformed(ActionEvent e) {
//für die Schaltflächen zum Beenden
if (e.getActionCommand().equals("Ende"))
System.exit(0);
//für die Auswahl eines einzelnen Bildes
if (e.getActionCommand().equals("Laden"))
bildLaden();
//für die Auswahl der Bilder für die Bilderschau
if (e.getActionCommand().equals("LadenSchau"))
bilderSchau();

//Grundeinstellung für die Pause bei der Bilderschau in Millisekunden
anzeigenDauer = 5000;
// Grundeinstellung Sekundenanzeige des Drehfeldes
sekunden = 5;}

// Reaktion auf Statuswechsel in dem Drehfeld
@Override
public void stateChanged(ChangeEvent e) {
if (e.getSource()instanceof JSpinner){
int sekunden = (int) zeitschalter.getValue;{

if (sekunden == 1){
anzeigenDauer = 1000;}
if (sekunden == 2){
anzeigenDauer = 2000;}
if (sekunden == 3){
anzeigenDauer = 3000;}
if (sekunden == 4){
anzeigenDauer = 4000;}
if (sekunden == 5){
anzeigenDauer = 5000;}
if (sekunden == 6){
anzeigenDauer = 6000;}
if (sekunden == 7){
anzeigenDauer = 7000;}
if (sekunden == 8){
anzeigenDauer = 8000;}
if (sekunden == 9){
anzeigenDauer = 9000;}
if (sekunden == 10){
anzeigenDauer = 10000;}
}

}

}

}
//der Konstruktor
public Bildbetrachter(String titel) {
super(titel);
initGUI();
}

//die Methode zum Erstellen der Oberfläche
private void initGUI() {
//die Panels für die Register
JPanel registerEinzel = new JPanel();
JPanel registerSchau = new JPanel();

//das TabbedPane
JTabbedPane panelKomplett = new JTabbedPane();

//das Register für die Einzelanzeige
//eine neue Instanz für das Panel mit der Grafik erzeugen
bildAnzeige = new BildPanel();

//die Komponenten erstellen und einbauen
registerEinzel.setLayout(new FlowLayout(FlowLayout.LEFT));
registerEinzel.add(bildAnzeige);

oeffnen = new JButton("Bild laden");
beenden = new JButton("Beenden");
oeffnen.setActionCommand("Laden");
beenden.setActionCommand("Ende");
eingabe = new JTextField(20);

skalieren = new JCheckBox("Anpassen");

registerEinzel.add(new JLabel("Bilddatei: "));
registerEinzel.add(eingabe);
registerEinzel.add(skalieren);
registerEinzel.add(oeffnen);
registerEinzel.add(beenden);

//die Listener verbinden
MeinListener listener = new MeinListener();
oeffnen.addActionListener(listener);
beenden.addActionListener(listener);
//zeitschalter.addChangeListener(listener);

//das Register für die Bilderschau
//eine neue Instanz für das Panel mit der Grafik erzeugen
bildAnzeigeSchau = new BildPanel();

//die Komponenten erstellen und einbauen
registerSchau.setLayout(new FlowLayout(FlowLayout.LEFT));
registerSchau.add(bildAnzeigeSchau);

oeffnenSchau = new JButton("Bilder laden");
beendenSchau = new JButton("Beenden");
oeffnenSchau.setActionCommand("LadenSchau");

// Variable setzen für zeitschalter Drehfeld
SpinnerNumberModel drehFeldModel = new SpinnerNumberModel(5,0,10,1);
zeitschalter = new JSpinner(drehFeldModel);
//die Schaltfläche zum Beenden bekommt dasselbe ActionCommand wie im anderen Register
beendenSchau.setActionCommand("Ende");

registerSchau.add(oeffnenSchau);
registerSchau.add(beendenSchau);
registerSchau.add(zeitschalter);

//die Listener verbinden
oeffnenSchau.addActionListener(listener);
beendenSchau.addActionListener(listener);
zeitschalter.addChangeListener(listener);

//und nun alles zusammenbauen

panelKomplett.add("Einzelbild",registerEinzel);
panelKomplett.add("Bilderschau",registerSchau);

add(panelKomplett);

//Größe setzen, anzeigen, keine Größenänderungen zulassen und Standard-Verhalten festlegen
setSize(350,450);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}

//die Methode zum Laden eines Bildes über den Dialog
private void bildLaden() {
//einen Standard-Öffnen-Dialog erzeugen
BildbetrachterDialog dialog = new BildbetrachterDialog();
//die Rückgabe holen
String datei = dialog.dialogZeigen();
//wenn eine Datei ausgewählt wurde, laden
if (datei != null) {
bildAnzeige.grafikLaden(datei, skalieren.isSelected());
//den Namen der Datei im Eingabefeld anzeigen
eingabe.setText(datei);
}
}

//die Methode zur Anzeige der Bilderschau
private void bilderSchau() {
//einen Standard-Öffnen-Dialog erzeugen
BildbetrachterDialog dialogSchau = new BildbetrachterDialog();
//die Rückgabe holen und in einem Array vom Typ File ablegen
File[] dateien = dialogSchau.dialogZeigenMehrere();

//wenn eine Datei ausgewählt wurde, alle Dateien nacheinander anzeigen
if (dateien != null) {
for (File datei: dateien) {
bildAnzeigeSchau.grafikLaden(datei.toString(), true);
//nach jeder Datei machen wir eine kurze Pause
try {
Thread.sleep(anzeigenDauer);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
[/Java]

Hilfe wäre echt Super :)
 

hdi

Top Contributor
Hey,

erstmal:

Java:
    if (sekunden == 1){
                    anzeigenDauer = 1000;}
                if (sekunden == 2){
                    anzeigenDauer = 2000;}
                if (sekunden == 3){
                    anzeigenDauer = 3000;}
                if (sekunden == 4){
                    anzeigenDauer = 4000;}
                if (sekunden == 5){
                    anzeigenDauer = 5000;}
                if (sekunden == 6){
                    anzeigenDauer = 6000;}
                if (sekunden == 7){
                    anzeigenDauer = 7000;}
                if (sekunden == 8){
                    anzeigenDauer = 8000;}
                if (sekunden == 9){
                    anzeigenDauer = 9000;}
                if (sekunden == 10){
                    anzeigenDauer = 10000;}
                }

Wie wäre es mit:

Java:
anzeigenDauer = 1000 * sekunden;

Ansonsten:
Poste mal bitte die Exception. Es dürfte nicht vorkommen dass er das nicht nach int casten kann, da du ein NumberModel verwendest, und das sind nun mal nur zahlen. Hab mir jetzt den kompletten Code nicht angesehen. Mit der Fehlermeldung findet man das schneller.

Ich nehme übrigens an dass das hier:

Java:
zeitschalter.getValue;

in deinem wirklichen Code nicht so dasteht?! Denn das lässt sich nicht kompilieren.
 

Jomama09

Aktives Mitglied
Tja ,dein Tip scheint gut zu sein, da ich hierdurch immer nur die sekunden einbringen muss, nur wie kommt das am besten im Code unter ?

Hatte vor mit dem Code :

[Java]

public void stateChanged(ChangeEvent e) {
if (e.getSource()instanceof JSpinner){
int sekunden = (int) zeitschalter.getValue;{

if (sekunden == 1){
anzeigenDauer = 1000;}
[/Java]

zuerst eine Änderung im Spinner festzustellen.
mit zeitschalter.getValue() den Wert im Spinner zu erfragen und dann über eine IF Abfrage die
Jeweilige Zeitspanne festzulegen.

Wie könnte ich es denn besser machen.
Der Fehler der natürlich angezeigt wird in Eclipse ist

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem:
zeitschalter.getValue cannot be resolved or is not a field

at bildbetrachter.Bildbetrachter$MeinListener.stateChanged(Bildbetrachter.java:65)
at javax.swing.JSpinner.fireStateChanged(Unknown Source)
at javax.swing.JSpinner$ModelListener.stateChanged(Unknown Source)
at javax.swing.AbstractSpinnerModel.fireStateChanged(Unknown Source)
at javax.swing.SpinnerNumberModel.setValue(Unknown Source)
at javax.swing.JSpinner.setValue(Unknown Source)
at javax.swing.plaf.basic.BasicSpinnerUI$ArrowButtonHandler.actionPerformed(Unknown Source)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

sieht zwar viel aus, dürfte aber nicht viel sein, da es vor der erweiterung mit dem Spinner lief. Ohne Fehler
 

hdi

Top Contributor
dann ist es ja doch der Syntax-Fehler. Er kann deinen Code nicht kompilieren, weil
Java:
zeitschalter.getValue;
nicht korrekt ist. Du rufst eine Methode auf, und der übergibt man Parameter. Selbst wenn es keine gibt braucht man trotzdem die Klammern. Also:
Java:
zeitschalter.getValue();

Wie könnte ich es denn besser machen.
Na genauso, wie ich es geschrieben hab ;)

Java:
public void stateChanged(ChangeEvent e) {
            if (e.getSource()instanceof JSpinner){
                int sekunden = (int) zeitschalter.getValue();
                anzeigenDauer = 1000 * sekunden;
            }
}

Macht doch jetzt genau das gleiche wie dein ewig fettes if-else-Geschlängel ;)
 

hdi

Top Contributor
Achso, weil int ist ein primitiver Datentyp. Objekte kannst du nicht in sowas umwandeln. Du musst die sog. "Wrapper"-Klasse für int verwenden. Das ist nix weiter als eine Klasse, die einen int nicht als primitiven Typ darstellt, sondern als "echtes" Objekt. Und dann kannst du das umwandeln.

Java:
int sekunden = (Integer)zeitschalter.getValue();

Von Integer wird automatisch in den primitiven Typ int umgewandelt. (Das nennt man "Auto-Unboxing" falls es dich interessiert)
 

Jomama09

Aktives Mitglied
Danke Super das hat geklappt, jetzt versuche ich mal ob auch alles klappt, wenn ich darüber jetzt die Zeitschleife einstelle.

Wusste nicht das das so gemacht wird. Dachte immer Int und Integer wäre das gleiche nur eben abgekürzt, da wäre ich so schnell nicht draufgekommen. kleinigkeit aber grosse WIRKUNG. Es schon versucht mit parsen aber das ging ja nicht.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben