JPanel 如何创建 instance/object

JPanel How to create an instance/object

我总是混淆 JFrame 和 JPanel。我有一个可以编译的代码,但什么也没有发生,程序结束了。

这是一项作业,要求我们画一个三角形。然后添加一个按钮,当按钮被按下时,三角形会倒转。再次按 return 到第一个位置。

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

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

   } 
}

您需要在主方法中将 JPanel 添加到 JFrame 对象,就像将按钮添加到面板一样。 JFrame 是您的 JPanel 所在的 window。

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

与您的问题无关,但我建议至少为您分离出一个私有的 class ActionListener,而不是让三角形 class 两者兼而有之。如果您喜欢冒险,可以考虑使用匿名内部 class 或 lambda 表达式。

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(...) 方法,因此我们也应该重写 JPanelgetPreferredSize() 方法:

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

否则我们会得到一个非常小的JFrame(这样做是个好习惯)

另外不要忘记将您的程序放在 EDT 上(正如我在本 的第 2 点中所示)

作为旁注,您可能还想按照@MadProgrammer 在

中的推荐使用形状的API

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