2016-05-30 5 views
-1

Ich möchte eine Koch Curve Snowflake in meinem Programm zeichnen, es funktioniert soweit bis auf 1 Problem.Wie können Grafiken direkt beim Start auf JPanel angezeigt werden?

Ich möchte eine gezeichnete Kurve direkt beim Start zeigen, aber kann nicht angezeigt werden (siehe Abschnitt im Code mit Kommentar). Nachdem ich den Knopf gedrückt habe, der eine Kurve zeichnen soll, zeigt es sich gut.

Was muss ich ändern, um etwas zu zeigen, das auf dem Panel gezeichnet wurde, bevor eine Taste gedrückt wurde?

package fractals; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class fractalsGUI extends JFrame { 

    private JPanel drawPanel, menuPanel; 
    private JButton drawButton; 
    private JTextField iterField; 
    private final JLabel iterLabel = new JLabel("Iterations:"); 
    private final int defaultIterations = 4; 

    private final double cos60 = 0.5; 
    private final double sin60 = 0.5 * Math.sqrt(3); 
    private final double lengthModifier = Math.sqrt(3) * 2/3; 

    public fractalsGUI() { 

     /* 
     * GUI grafics setup stuff 
     * 
     */ 

     setTitle("Koch Curve Snowflake Generator"); 

     drawPanel = new JPanel(); 
     menuPanel = new JPanel(); 
     drawButton = new JButton(); 
     iterField = new JTextField("" + defaultIterations, 2); 

     this.setSize(600, 600); 

     drawButton.setText("Draw Curve"); 
     drawButton.setActionCommand("drawCurve"); 

     setLayout(new BorderLayout()); 

     this.add(drawPanel, BorderLayout.CENTER); 
     this.add(menuPanel, BorderLayout.SOUTH); 

     menuPanel.add(iterLabel); 
     menuPanel.add(iterField); 
     menuPanel.add(drawButton); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 

     /* 
     * draw initial Curve --- THIS DOES NOT SHOW --- 
     */ 

     drawSegment(drawPanel.getGraphics(), new Point(200,300), new Point(400,300), 3); 


     /* 
     * GUI Button functions 
     * 
     */ 

     drawButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       if (e.getActionCommand().equals("drawCurve")) { 

        int iterations = Integer.parseInt(iterField.getText()); 

        if (iterations > 8) 
         iterations = 8; 

        else if (iterations < 0) 
         iterations = 0; 

        drawCurve(iterations, drawPanel.getGraphics(), new Rectangle(drawPanel.getSize())); 
       } 
      } 
     }); 

    } 

    public void drawSegment(Graphics g, Point start, Point end, int iteration) { 

     // base case 
     if (iteration == 0) 
      g.drawLine(start.x, start.y, end.x, end.y); 

     // recursion 
     else { 

      Point distance = new Point((end.x - start.x)/3, (end.y - start.y)/3); 
      Point firstThirdEnd = new Point(start.x + distance.x, start.y + distance.y); 
      Point lastThirdStart = new Point(end.x - distance.x, end.y - distance.y); 
      Point triangleTip = new Point(firstThirdEnd.x + (int) (distance.x * cos60 + distance.y * sin60), firstThirdEnd.y + (int) (distance.y * cos60 - distance.x * sin60)); 

      drawSegment(g, start, firstThirdEnd, iteration - 1); 
      drawSegment(g, firstThirdEnd, triangleTip, iteration - 1); 
      drawSegment(g, triangleTip, lastThirdStart, iteration - 1); 
      drawSegment(g, lastThirdStart, end, iteration - 1); 
     } 

    } 

    public void drawCurve(int iterations, Graphics g, Rectangle bounds) { 

     // fill in background 
     g.setColor(Color.white); 
     g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height); 

     double w, h; 

     if (bounds.height < (int) (bounds.width * lengthModifier)) { 
      // height is limiting 
      h = bounds.height; 
      w = h/lengthModifier; 
     } 

     else { 
      // width is limiting 
      w = bounds.width; 
      h = w * lengthModifier; 
     } 

     int top = bounds.y + (int) ((bounds.height - h)/2 + (h/4)); 
     Point curve1start = new Point(bounds.x + (int) ((bounds.width - w)/2), top); 
     Point curve2start = new Point(bounds.x + (int) ((bounds.width + w)/2), top); 
     Point curve3start = new Point(bounds.x + (bounds.width/2), bounds.y + (int) ((bounds.height + h)/2)); 

     // draw recursion 

     g.setColor(Color.red); 
     drawSegment(g, curve1start, curve2start, iterations); 

     g.setColor(Color.blue); 
     drawSegment(g, curve2start, curve3start, iterations); 

     g.setColor(Color.green); 
     drawSegment(g, curve3start, curve1start, iterations); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 

       fractalsGUI mainWindow = new fractalsGUI(); 

      } 
     }); 
    } 

} 
+0

du gerade getan haben versucht DrawCurve in der Haupt nach der Initialisierung Mainwindow anrufen? – Lucarnosky

+0

Beginnen Sie damit, das grundlegende Konzept zu verstehen, wie Swing-Farben auf einer Komponente aufgetragen werden. Jede Aktion, die etwas auf eine Komponente rendert, sollte von 'paintComponent', keinem Konstruktor oder etwas anderem ausgelöst werden. Ein guter Anfang wäre daher, den Code so umzuformulieren, dass er dieser Anforderung entspricht. – Paul

Antwort

0

nach diesem

drawSegment(drawPanel.getGraphics(), new Point(200,300), new Point(400,300), 3); nennt diese

drawPanel.repaint()

+0

Das löst es nicht. Ich bekomme immer noch einen leeren Rahmen. – voiDnyx

+0

Sie könnenVisible (true) setzen, nachdem der Konstruktor zurückgegeben wurde. Versuchen Sie nicht, JFrame zu erweitern. –

Verwandte Themen