我一直在混淆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);
}
}
答案 0 :(得分:2)
将JPanel
视为一张纸,将JFrame
视为一本书。
如果你从未将这张纸添加到书中,它将永远不会显示出来。
所以,以下是让程序运行的步骤:
JFrame
,其中包含JPanel
(三角形)ActionListener
中添加一些逻辑,以获得一个布尔标志,该标志将根据当前状态更改为true
或false
,并根据它重新绘制窗格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表达式。