double Buffering abschalten?

Status
Nicht offen für weitere Antworten.

divramod

Mitglied
Hallo,

ich soll das Problem der "Türme von Hanoi" implementieren.
Dabei funktioniert eigentlich schon alles einwandfrei.

Bis auf folgendes Problem:

Es werden nur der Startzustand und Endzustand der Grafik ( Türme ) angezeigt.
Ich möchte hingegen auch die Zustände nach den einzelnen Bewegungen der Scheiben sehen.
Habe schon verschiedenste Sachen ausprobiert und komme zu dem Schluss, das dies irgendetwas mit der doppelten Pufferung zu tun haben könnte.

Kann mir jemand eventuell einen Tipp geben, wie ich mir auch die Zwischenzustände einer Grafik anzeigen lassen kann?
Die Methode, welche die Scheiben von Turm zu Turm bewegt ist rekursiv, am Anfang dieser rufe ich repaint() auf.

Hier mal der Quelltext meiner TurmKlasse:

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.RepaintManager;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;

public class TowerAdministrator extends JLabel //implements Runnable
{
  private TowerPanel towers[] = new TowerPanel[ 3 ];
  private int quantity;
  private MyTextAreaWindow text = new MyTextAreaWindow( "TextArea", "", 0 );
  
  private class TowerPanel extends JPanel
  {
    private Graphics2D g2 = null;
    private ArrayList planeList = new ArrayList();
    private Dimension tempPlane = null;
    private int planeHigh = 0;
    private int quantityPlanes;
    
    public TowerPanel( int quantity )
    {
      quantityPlanes = quantity;     
    }
    
    /**Diese Methode überschreibt die paintComponent- Methode.
     * @param g Der Gerätekontext, auf welchen gezeichnet wird.
     */
    public void paintComponent(Graphics g) 
    {
      super.paintComponent(g);
      this.g2 = ( Graphics2D ) g;
      createEmptyTower();
      drawPlanes();
      System.out.print( " " + planeList.size() + " " );
    }
   
    private void createEmptyTower()
    {
      drawBar();
      drawBaseplate();
    }
    
    private void drawBar()
    {
      g2.setColor( Color.RED );
      g2.fillRoundRect( 145, 20, 10, 460, 20, 20 );
    }
    
    private void drawBaseplate()
    {
      g2.setColor( Color.red );
      g2.fillRoundRect( 20, 470, 260, 10, 20, 20 );
    }
    
    private void setTitledBorder( String titel )
	{
      Border rand = BorderFactory.createEtchedBorder();
      Border randtitel = BorderFactory.createTitledBorder(rand, 
                                                          titel,
                                                          TitledBorder.CENTER,
                                                          TitledBorder.TOP);                                                                  
      setBorder(randtitel);
	}
    
    public void initPlanes()
    {      
      int width = 0;      
      planeHigh = 460 / quantityPlanes;
      int hight = planeHigh;
      int planeReduction;
      planeReduction = 220 / quantityPlanes;
      for ( int i = 0; i < quantityPlanes; i++ )
      {
        width = 260 - ( planeReduction * i );
        planeList.add( new Dimension( width, hight ) );
        System.out.print( " er versuchts "); //Hilfsausgabe
      }      
    }
    
    public void drawPlanes()
    {
      int xCo, yCo;
      for ( int i = 0; i < quantityPlanes; i++ )
      {
        tempPlane  = ( Dimension )planeList.get(i);        
        
        xCo = ( int ) ( 20 + ( ( 260 - tempPlane.getWidth() ) / 2 ) );
        yCo = ( int ) ( 470 - planeHigh - ( i * planeHigh ) );
        
        g2.setColor( Color.GREEN );
        g2.fillRoundRect( xCo, yCo, ( int ) tempPlane.getWidth(), 
            ( int ) tempPlane.getHeight(), 10, 10 );
      }
    }
 
    public Dimension getPlane( int index )
    {
      tempPlane  = ( Dimension )planeList.get( index ); 
      Dimension plane = new Dimension( ( int ) tempPlane.getWidth(), ( int ) tempPlane.getHeight() );
      return plane;
    }
    
    public void removePlane( int index )
    {
      planeList.remove( index );
      quantityPlanes -= 1;
      update( g2 );
      //System.out.println(" remove ");
    }
    
    public void addPlane( Dimension dim )
    {
      planeList.add( new Dimension( ( int ) dim.getWidth(), ( int ) dim.getHeight() ) );
      quantityPlanes += 1;
      update( g2 );
      //System.out.println(" add ");
    }    
    
    public void setPlaneHight( int hight)
    {
      planeHigh = hight;
    }
    
    public int getPlaneHight()
    {
      return planeHigh;
    }
  
    public int getPlaneQuantity()
    {
      return quantityPlanes;
    }
  } 
  
  public TowerAdministrator()
  {
    super();
    quantity = 5;
    initTowers( quantity );
  }

  public void laufe()
  {    
    text.requestFocusInWindow();
    text.setSize( 10, 200 );
    text.setVisible( true );
    movePane( quantity, 0, 2, 1 );   
  }
  
  private void movePane( int quantityPanes, int source, int target, int clipboard  )
  {    
    repaintTowers();
    if ( quantityPanes == 1 )
    {
      towers[ target ].addPlane( towers[ source ].getPlane( towers[ source ].getPlaneQuantity() - 1 ) );
      towers[ source ].removePlane( towers[ source ].getPlaneQuantity() - 1 );
      text.refreshArea( source + "--->" + target + "\n" );        
    }
    else
    {
      movePane( ( quantityPanes - 1 ), source, clipboard, target );
      towers[ target ].addPlane( towers[ source ].getPlane( towers[ source ].getPlaneQuantity() - 1 ) );
      towers[ source ].removePlane( towers[ source ].getPlaneQuantity() - 1 );
      text.refreshArea( target + "--->" + source + "\n" );
      movePane( ( quantityPanes - 1 ), clipboard, target, source );
    }
  }
  
  public void repaintTowers()
  {
    towers[ 0 ].repaint();
    towers[ 1 ].repaint();
    towers[ 2 ].repaint();
  }
  
  private void place()
  {
    setLayout( new GridBagLayout() );        
    GridBagConstraints c = new GridBagConstraints();
    
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 0.3333;
    c.weighty = 1.0;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    add( towers[ 0 ], c );
    
    c.gridx = 1;
    add( towers[ 1 ], c );
    
    c.gridx = 2;
    add( towers[ 2 ], c );  
  }
  
  private void initTowers( int quant )
  {
    getTower1Panel( "Tower 1", quant );
    getTower2Panel( "Tower 2" );
    getTower3Panel( "Tower 3" );
    place();
  }
  
  private TowerPanel getTower1Panel( String title, int quant )
  {
    TowerPanel tower1 = new TowerPanel( quant );
    towers[ 0 ] = tower1;
    RepaintManager.currentManager( towers[ 0 ] ).setDoubleBufferingEnabled( false);
    tower1.initPlanes();
    tower1.setSize( 300, 540 );
    tower1.setTitledBorder( title );
    tower1.setOpaque( true );
    tower1.requestFocusInWindow();
    return tower1;
  }
  
  private JPanel getTower2Panel( String title )
  {
    TowerPanel tower2 = new TowerPanel( 0 );
    towers[ 1 ] = tower2;
    RepaintManager.currentManager( towers[ 1 ] ).setDoubleBufferingEnabled( false);
    tower2.setPlaneHight( towers[ 0 ].getPlaneHight() );
    tower2.setSize( 300, 540 );
    tower2.setTitledBorder( title );
    tower2.setOpaque( true );
    tower2.requestFocusInWindow();
    return tower2;
  }
  
  private JPanel getTower3Panel( String title )
  {
    TowerPanel tower3 = new TowerPanel( 0 );
    towers[ 2 ] = tower3;
    RepaintManager.currentManager( towers[ 2 ] ).setDoubleBufferingEnabled( false);
    tower3.setPlaneHight( towers[ 0 ].getPlaneHight() );
    tower3.setSize( 300, 540 );
    tower3.setTitledBorder( title );
    tower3.setOpaque( true );
    tower3.requestFocusInWindow();
    return tower3;
  }
}

Bin für eine Lösung meines Problems sehr dankbar, da ich jetzt schon sehr viel Zeit investiert habe.

Roar: bitte codetags benutzen
 

Wildcard

Top Contributor
Mit dem DoubleBuffering hat das rein gar nichts zu tun (lass es unbedingt an)!
Du brauchst einen Thread der die Berechnungen ausführt, sich dann schlafen legt während du den aktuellen
Zustand darstellst. (Wie sinnvoll ist es eigentlich die Türme von Hanoi zu visualisieren??? :wink: )
 

divramod

Mitglied
also lasse ich meine Klasse TowerAdministrator runnable implementieren, denk ich mal?
Problem dabei war für mich nur, das diese nicht die Methode sleep() hat. Oder kann ich eventuell von zwei Klassen erben?
 

Wildcard

Top Contributor
divramod hat gesagt.:
also lasse ich meine Klasse TowerAdministrator runnable implementieren, denk ich mal?
Problem dabei war für mich nur, das diese nicht die Methode sleep() hat. Oder kann ich eventuell von zwei Klassen erben?
Code:
new Thread(this).start();
Thread.sleep();
Mach dir besser eine eigene Klasse die die 'Berechnungen' übernimmt.
Überhaupt solltest du das ganze entzerren. Warum nicht eine eigene Klasse für eine Scheibe die sich selbst zeichnen kann usw...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Applet Double Buffering AWT, Swing, JavaFX & SWT 2
T 2D-Grafik Double Buffering AWT, Swing, JavaFX & SWT 7
lumo SWT Double Buffering AWT, Swing, JavaFX & SWT 5
K Flackern trotz Double-Buffering AWT, Swing, JavaFX & SWT 10
hdi Wie implementiere ich Double Buffering AWT, Swing, JavaFX & SWT 12
G Frage zu Double Buffering AWT, Swing, JavaFX & SWT 4
U Double Buffering AWT, Swing, JavaFX & SWT 6
J Double-Buffering zu langsam AWT, Swing, JavaFX & SWT 4
L Double-Buffering AWT, Swing, JavaFX & SWT 2
L Double Buffering bei JTable AWT, Swing, JavaFX & SWT 4
CptK Point2D.Double Kurven - Beschriftung und richtiges Anklicken AWT, Swing, JavaFX & SWT 7
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
B AWT GUI nimmt nur 19 Ziffern an, obwohl Max Wert von Double größer ist AWT, Swing, JavaFX & SWT 7
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
S Polygon mit double-Koordinaten AWT, Swing, JavaFX & SWT 2
N Double Buffern von BILDERN AWT, Swing, JavaFX & SWT 6
B Graphics2d drawString mit double Werten? AWT, Swing, JavaFX & SWT 5
O 2D-Grafik Rectangle mit double Werten zeichnen AWT, Swing, JavaFX & SWT 3
M Object[][] in double[][] casten AWT, Swing, JavaFX & SWT 6
A aus einem Textfeld in double parsen AWT, Swing, JavaFX & SWT 10
J JSlider mit Double Werten AWT, Swing, JavaFX & SWT 5
T JTextField nur Double werte eingeben AWT, Swing, JavaFX & SWT 2
A Explicit casting Point2D.Double AWT, Swing, JavaFX & SWT 3
A TableRowSorter für double Werte mit Formatierung AWT, Swing, JavaFX & SWT 3
iLoveTheInternet AWT Rectangle2D.Double intersecs AWT, Swing, JavaFX & SWT 6
R drawString mit double Koordinaten AWT, Swing, JavaFX & SWT 5
L JTextField Umwandeln in double-Werte AWT, Swing, JavaFX & SWT 5
K double / int einlesen? AWT, Swing, JavaFX & SWT 12
L double in JTable formatieren AWT, Swing, JavaFX & SWT 7
P Integer, Double, etc mit getTableCellRendererComponent AWT, Swing, JavaFX & SWT 6
P Double-Werte sortieren mit TableRowSorter AWT, Swing, JavaFX & SWT 2
B JFormattedTextField mit DecimalFormat in ein Double AWT, Swing, JavaFX & SWT 11
S double in String umwandeln AWT, Swing, JavaFX & SWT 6
R Double in der Tabelle statt String und Integer AWT, Swing, JavaFX & SWT 3
Student "Dicke" einer Linie - Line2D.Double AWT, Swing, JavaFX & SWT 12
G Double-Click f. alle Komps UNIX u. WIN verschieden ? AWT, Swing, JavaFX & SWT 5
G Ellipse2D.Double funktioniert nicht AWT, Swing, JavaFX & SWT 3
W SWT - Tree: Problem mit Double-Click expand AWT, Swing, JavaFX & SWT 5
K AWT flackern trotz buffering AWT, Swing, JavaFX & SWT 4
thobren listview seclect abschalten AWT, Swing, JavaFX & SWT 1
S Swing JTable RowSorter trotz RowFilter abschalten? AWT, Swing, JavaFX & SWT 2
G JInternalFrame und beinhaltende Komponenten 'abschalten' AWT, Swing, JavaFX & SWT 2
V Mouseover-Effekt bei JButton abschalten? AWT, Swing, JavaFX & SWT 2
S KeyListener von JTabbedPane "abschalten" AWT, Swing, JavaFX & SWT 3
G Interaktion mit einem Programm abschalten AWT, Swing, JavaFX & SWT 2
H jCheckBox abschalten AWT, Swing, JavaFX & SWT 3
L GlassPane ein und abschalten AWT, Swing, JavaFX & SWT 3
T Warnsounds in Swing-Anwendungen abschalten AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben