JPanel如何创建实例/对象

时间:2017-08-14 21:30:34

标签: java swing jframe jpanel

我一直在混淆JFrame和JPanel。我有一个代码编译,但没有发生,程序结束。

这是一项家庭作业,要求我们画一个三角形。然后添加一个按钮,当按下按钮时,三角形将颠倒翻转。再按一次返回第一个位置。

任何帮助都会很棒。这是我无数的草稿,我只想尝试启动对象查看。

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);

   } 
}

2 个答案:

答案 0 :(得分:2)

JPanel视为一张纸,将JFrame视为一本书。

如果你从未将这张纸添加到书中,它将永远不会显示出来。

所以,以下是让程序运行的步骤:

  • 创建一个JFrame,其中包含JPanel(三角形)
  • ActionListener中添加一些逻辑,以获得一个布尔标志,该标志将根据当前状态更改为truefalse,并根据它重新绘制窗格
  • paintComponent(...)方法中有一些逻辑,根据上面布尔标志的状态将三角形上下颠倒或上翻

所以,从上面的main(...)方法中你应该有

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

您的actionPerformed()方法应如下所示:

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

您的paintComponent()

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

由于我们正在使用pack()而不是setSize(...)方法,因此我们应该覆盖getPreferredSize()的{​​{1}}方法:

JPanel

否则我们可以得到一个非常小的@Override public Dimension getPreferredSize() { return new Dimension(400, 400); } (以这种方式这是一个很好的做法)

也不要忘记把你的节目放在EDT上(正如我在answer的第2点所示)

作为旁注,您可能还希望按照this answer

中@MadProgrammer的建议使用Shape的API。

上面的两个链接都有很酷的示例和提示,请查看它们!

答案 1 :(得分:0)

您需要将JPanel添加到main方法中的JFrame对象,方法与向面板添加按钮的方式相同。 JFrame是JPanel内部存在的窗口。

确保将JFrame对象设置为visible并设置其大小。

与你的问题没有关系,但我建议至少为你的ActionListener分离一个私有类,而不是让Triangle类都是。如果您有冒险精神,可以考虑使用匿名内部类或lambda表达式。