Kreisel

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,
Hier Folgende Aufgabe: Aufgabe

Hier mein Code dazu:
Code:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.*;


public class Fenster extends JPanel implements ChangeListener{
	
	AffineTransform at = new AffineTransform();
	JSlider slide;
	JFrame frame = new JFrame();
	Segment seg = new Segment();
	static int value = 30;
	
	
	public Fenster(){
		frame.setSize(200, 200);
		frame.setLayout(new BorderLayout());
		slide = new JSlider(SwingConstants.HORIZONTAL, 0, 100, 30);
		slide.addChangeListener(this);
		frame.add(slide, BorderLayout.PAGE_END);
		frame.add(seg, BorderLayout.CENTER);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public void stateChanged(ChangeEvent e){
		if(e.getSource() == slide){
			value = slide.getValue();
		}
	}
	
	public class Segment extends JPanel implements Runnable{
		
		
		
		public void paintComponent(Graphics g){
			super.paintComponent(g);
			Graphics2D g2d = (Graphics2D) g;
			g2d.setTransform(at);
			g2d.fillArc(0, 0, 200, 200, 0 , 60);
			g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			
		}
		
		public void run(){
			while(true){
				try{
					Thread.sleep(value);
					at.rotate(Math.PI/180, 200, 200);
					repaint();
				}
				catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
	
	public static void main(String [] args){
		new Fenster();
	}
}

Ich weiß nicht, wieso die run-Methode nicht startet, bzw. wieso es insgesamt nicht funktioniert. Bin ich einfach nur Blind, und übersehe einen Leichtsinnsfehler, oder ist es ein gravierender Fehler?
Bitte um Hilfe!
MFG
 

Marco13

Top Contributor
Der Thread wird ja nirgendwo gestartet?!
Als letzte Zeile im Fenster-Konstruktor vielleicht sowas wie

Thread t = new Thread(segment);
t.start();

!?
 

Marcel_Handball

Bekanntes Mitglied
Mal als funktionierendes Beispiel:

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


public class Hauptprogramm{
	public static void main(String [] args){
	      new Fenster();    
	}
}

class Fenster extends JFrame{
   
	Segment s = new Segment();
	JSlider slider;
	Thread t = new Thread(s);
	static int value = 30;
 
	public Fenster(){
      setSize(450, 450);
      setLayout(new BorderLayout());
      slider = new JSlider(SwingConstants.HORIZONTAL, 1, 100, 30);
      slider.addChangeListener(new ChangeListener(){
    	  public void stateChanged(ChangeEvent e) {
    		  value = slider.getValue();
    	}
      });
      add(slider, BorderLayout.PAGE_END);
      add(s, BorderLayout.CENTER);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setResizable(false);
      setVisible(true);
      
      t.start();
	}

	public void stateChanged(ChangeEvent e){
		value = slider.getValue();
	}	
}   
  

   
class Segment extends JPanel implements Runnable{
	int i=0;
	
	public Segment(){
		setSize(400, 400);
	}
      
    public void paintComponent(Graphics g){
         super.paintComponent(g);
         g.fillArc(0, 0, 400, 400, i , 60);  
    }
      
    public void run(){
    	  
         while(true){
            try{
               Thread.sleep(Fenster.value);
               repaint();
               i += 359;
               i %= 360;
            }
            catch(Exception e){
               e.printStackTrace();
            }
         }
    }
 }
 

m@nu

Bekanntes Mitglied
geholfen wurde dir ja bereits.

ich habe jedoch noch eine bemerkung zum einschalten des antialiasing.

Code:
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
das schaltet zwar antialiasing ein. aber du musst es VOR dem zeichnen einschalten. ansonsten bringt das ganze nichts :)

also z.b. so:
Code:
      public void paintComponent(Graphics g){
         super.paintComponent(g);
         Graphics2D g2d = (Graphics2D) g;
         g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
         g2d.setTransform(at);
         g2d.fillArc(0, 0, 200, 200, 0 , 60);
         
      }

grüsse
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben