Elements
Elements

Reputation: 69

JPanel How to create an instance/object

I keep mixing up JFrame and JPanel. I have a code that compiles but nothings happens and the program ends.

This is a homework assignment that requires us to draw a triangle. Then add a button, when button is pressed the triangle will flip upside down. Press again to return to the first location.

Any assistance would be great. This is my countless rough draft and I'm just trying to initiate the object to view.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.Line2D;
import java.awt.Color;



public class Triangle extends JPanel implements ActionListener

{
   JButton button = new JButton("Just Flip It");

   public Triangle()
   {
      add(button);
      button.addActionListener(this);
   }

   public void actionPerformed(ActionEvent e)
   {

   }
   @Override
   public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      g.drawLine(125,75,100,200);
      g.drawLine(125,75,150,200);
      g.drawLine(100,200,150,200);


   }

   public static void main(String[] args)
   {

      Triangle frame = new Triangle();
      frame.setSize(400, 400);
      frame.setVisible(true);

   } 
}

Upvotes: 1

Views: 1570

Answers (2)

Frakcool
Frakcool

Reputation: 11143

Think of a JPanel as a piece of paper and a JFrame as a book.

If you never add the piece of paper to the book, it will never be shown.

So, here are the steps to get your program running:

  • Create a JFrame that will hold your JPanel (Triangle) inside it
  • Add some logic in your ActionListener to have a boolean flag, that will be changed to true or false depending on the current state and based on it repaint the pane
  • Have some logic inside the paintComponent(...) method that draws the triangle upside down or upside up based on the state of the boolean flag above

So, from the above in your main(...) method you should have

JFrame frame = new JFrame("My frame");
//Initialize your Triangle here
frame.add(triangle);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);

Your actionPerformed() method should look like this:

public void actionPerformed(ActionEvent e)
{
    clicked = !clicked;
    repaint();
}

And your paintComponent():

super.paintComponent();
if (clicked) {
    //Draw upside up
} else {
    //Draw upside down
}

As we're using pack() instead of setSize(...) method, we should override getPreferredSize() method of our JPanel as well:

@Override
public Dimension getPreferredSize() {
    return new Dimension(400, 400);
}

Otherwise we could get a really small JFrame (and it's a good practice to do it this way)

Also don't forget to place your program on the EDT (as I show in the point #2 of this answer)

As a side note, you might also want to move to use the Shape's API as recommended by @MadProgrammer in this answer

Both links above have cool examples and tips, check them out!

Upvotes: 2

Lucas Robbins
Lucas Robbins

Reputation: 13

You need to add your JPanel to a JFrame object in your main method in the same way you add a button to your panel. The JFrame is the window that your JPanel exists inside of.

Make sure that you set the JFrame object to visible and set its size.

Not related to your question, but I would suggest at least separating out a private class for you ActionListener rather than having the Triangle class be both. If you're feeling adventurous, you could look into using an anonymous inner class or a lambda expression.

Upvotes: 0

Related Questions