Applikation mit JSlider

soa

Erfahrenes Mitglied
Hallo,

habe eine kleines Programm, das beim Verschieben des Sliders einen Balken (fillRect)
verändert. Das klappt auch ganz gut. Nun besteht das Programm aus 2 Balken und einem
dazugehörigen Slider. Wenn beide Balken gleich groß sind, dann soll ein text "Beide Balken sind gleich groß" ausgegeben werden. Wenn Balken x größer ist als y soll "Balken x größer als y" ausgeben werden......etc.

Leider bekomme ich diese Ausgabe nicht hin. Egal wie ich die Slider verschiebe,
es steht immer da, dass beide Balken gleich groß sind.

Hier mal der Code:

Code:
Über einen kurzen Hinweis wäre ich sehr dankbar.

Grüsse

SOA



import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JComponent;

public class HinzKunzSwing extends JFrame{
  
  int x = 20;
  int y = 20;	
  private int schieberWert = 5;
  private  int schieberWert1 = 5;	
  JSlider balkenHinz;
  JSlider balkenKunz;
  JLabel zeile1;
  JLabel zeile1a;
  JLabel ausgabe1;
  JLabel ausgabe2;
  JLabel ausgabe3;
  Container contentPane;
  
  
public HinzKunzSwing() {
	

	
    balkenHinz = new JSlider(JSlider.HORIZONTAL,0, 255, 100);
    

    
    balkenKunz = new JSlider(JSlider.HORIZONTAL,0, 255, 100);
    
    
    
    zeile1 = new JLabel("Hinz:");
    zeile1a = new JLabel("Kunz:");
 
    ausgabe1 = new JLabel("Hinz ist groesser!");
    ausgabe2 = new JLabel ("Kunz ist groesser!");
    ausgabe3 = new JLabel ("Beide sind gleich gross!");
    contentPane = getContentPane();
    contentPane.setLayout(new FlowLayout());
   
    contentPane.add(zeile1, BorderLayout.SOUTH);
    contentPane.add(balkenHinz, BorderLayout.WEST);
    contentPane.add(zeile1a, BorderLayout.NORTH);
    contentPane.add(balkenKunz, BorderLayout.WEST);
    contentPane.setBackground(new Color(255, 255, 100));
    
    balkenVergleich();
   
   
   
    WindowListener listener = new WindowAdapter(){
      public void windowClosing(WindowEvent e){
        System.exit(0);
      }
    };
    this.addWindowListener(listener);

   balkenHinz.addChangeListener(new ChangeListener(){
  public void stateChanged(ChangeEvent e){
     
        JSlider source = (JSlider)e.getSource();
        if (source.getValueIsAdjusting()) {
          schieberWert = (int)source.getValue();
         repaint();
         
        }
      }
    });
    
   balkenKunz.addChangeListener(new ChangeListener(){
  public void stateChanged(ChangeEvent e){
  	
        JSlider source = (JSlider)e.getSource();
        if (source.getValueIsAdjusting()) {
        schieberWert1 = (int)source.getValue();
         repaint();
        }
      }
    }); 
    
    

}//Konstruktor


 public void balkenVergleich(){
 	
 	if (schieberWert == schieberWert1){
    contentPane.add(ausgabe3, BorderLayout.CENTER);
    repaint();
	}
    if (schieberWert < schieberWert1){
    contentPane.add(ausgabe1, BorderLayout.SOUTH);
    repaint();
	}
    if (schieberWert > schieberWert1){
    contentPane.add(ausgabe2, BorderLayout.CENTER);
    repaint();
	}
    
}

 public void paint(Graphics g){
 super.paint( g);
  	
  
    g.fillRect (100, 160, x+ schieberWert,y );
    g.fillRect (100, 190, x+ schieberWert1, y );
    
    final String zeile2=
    "Vergleich der Koerpergroessen -- Bewegen Sie die ScrollBars!";
    g.drawString( zeile2,  80,280 );
    final String zeile3="Hinz:";
    final String zeile4="Kunz:";
     g.drawString( zeile3, 40, 180 );
     g.drawString( zeile4, 40, 210 );
	}

  
  public static void main(String[] args) {
     HinzKunzSwing frame = new  HinzKunzSwing();
     frame.setTitle(" Hinz und Kunz mit Swing  ");
  

    frame.pack();
    frame.setSize(500, 300);
    frame.setVisible(true);
    

  }//Paint
}//Klasse
 
Moin,
also...
1. Du brauchst keine 3 Labels, einfach den Text für ein Label ändern.
2. Du rufst balkenVergleich() an der falschen Stelle auf. Wann soll die Funktion denn wohl aufgerufen werden? Du hast sie nur in den Konstruktor gelegt. Aber bei einem Event muss sie auch durchlaufen werden, sonst bekommst Du keinen Vergleich der aktuellen Werte. Also: raus damit aus dem Konstruktor und rein in die ChangeListener. Der Einfachheit halber poste ich mal meinen abgeänderten Code (funktioniert, hab eben getestet):

Code:
/**
 * @author Harald
 * 
 */

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class HinzKunzSwing extends JFrame
{
  int         x             = 20;
  int         y             = 20;
  private int schieberWert  = 5;
  private int schieberWert1 = 5;
  JSlider     balkenHinz;
  JSlider     balkenKunz;
  JLabel      zeile1;
  JLabel      zeile1a;
  JLabel      ausgabe1;
  JLabel      ausgabe2;
  JLabel      ausgabe3;
  Container   contentPane;
  private final String HINZ_GROESSER = "Hinz ist groesser!";
  private final String GLEICH   = "Beide sind gleich gross!"; 
  private final String KUNZ_GROESSER  = "Kunz ist groesser!";

  public HinzKunzSwing()
  {
    balkenHinz = new JSlider( JSlider.HORIZONTAL, 0, 255, 100 );
    balkenKunz = new JSlider( JSlider.HORIZONTAL, 0, 255, 100 );
    zeile1 = new JLabel( "Hinz:" );
    zeile1a = new JLabel( "Kunz:" );
    ausgabe3 = new JLabel( GLEICH );
    contentPane = getContentPane();
    contentPane.setLayout( new FlowLayout() );
    contentPane.add( zeile1, BorderLayout.SOUTH );
    contentPane.add( balkenHinz, BorderLayout.WEST );
    contentPane.add( zeile1a, BorderLayout.NORTH );
    contentPane.add( balkenKunz, BorderLayout.WEST );
    contentPane.add( ausgabe3, BorderLayout.CENTER );
    contentPane.setBackground( new Color( 255, 255, 100 ) );
    WindowListener listener = new WindowAdapter()
      {
        public void windowClosing( WindowEvent e )
        {
          System.exit( 0 );
        }
      };
    this.addWindowListener( listener );
    balkenHinz.addChangeListener( new ChangeListener()
      {
        public void stateChanged( ChangeEvent e )
        {
          JSlider source = (JSlider)e.getSource();
          if ( source.getValueIsAdjusting() )
          {
            schieberWert = (int)source.getValue();
            balkenVergleich();
            repaint();
          }
        }
      } );
    balkenKunz.addChangeListener( new ChangeListener()
      {
        public void stateChanged( ChangeEvent e )
        {
          JSlider source = (JSlider)e.getSource();
          if ( source.getValueIsAdjusting() )
          {
            schieberWert1 = (int)source.getValue();
            balkenVergleich();
            repaint();
          }
        }
      } );
  }//Konstruktor

  public void balkenVergleich()
  {
    if ( schieberWert == schieberWert1 )
    {
      ausgabe3.setText( GLEICH );
      repaint();
    }
    if ( schieberWert < schieberWert1 )
    {
      ausgabe3.setText( KUNZ_GROESSER );
      repaint();
    }
    if ( schieberWert > schieberWert1 )
    {
      ausgabe3.setText( HINZ_GROESSER );
      repaint();
    }
  }

  public void paint( Graphics g )
  {
    super.paint( g );
    g.fillRect( 100, 160, x + schieberWert, y );
    g.fillRect( 100, 190, x + schieberWert1, y );
    final String zeile2 = "Vergleich der Koerpergroessen -- Bewegen Sie die ScrollBars!";
    g.drawString( zeile2, 80, 280 );
    final String zeile3 = "Hinz:";
    final String zeile4 = "Kunz:";
    g.drawString( zeile3, 40, 180 );
    g.drawString( zeile4, 40, 210 );
  }

  public static void main( String[] args )
  {
    HinzKunzSwing frame = new HinzKunzSwing();
    frame.setTitle( " Hinz und Kunz mit Swing  " );
    frame.pack();
    frame.setSize( 500, 300 );
    frame.setVisible( true );
  }//Paint
}//Klasse
 
Jetzt musst Du nur noch dafür sorgen, dass die Balkenlänge auch immer richtig gezeichnet wird und der Sliderposition entspricht. ;)
 
Zurück