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:
Bin für eine Lösung meines Problems sehr dankbar, da ich jetzt schon sehr viel Zeit investiert habe.
Roar: bitte codetags benutzen
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