如何 "refresh" JFrame
How to "refresh" a JFrame
我当前的程序有这个问题;我根本不知道如何 "refresh" JFrame 以便它正确显示对变量 vangle 的更改。我当然导入了所有正确的文件。使用 JPanel 而不是 JFrame 有什么优势吗?请全力以赴! :)
public class projekt {
static int vangle = 20;
public static void main(String args[]) {new FractalTree().setVisible(true);
JFrame frame = new JFrame();
JButton b1 = new JButton();
frame.setSize(200, 100);
b1.setSize(20, 20);
b1.setVisible(true);
b1.setText("vinklen + 10");
frame.add(b1);
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //stoppe når jframen bliver lukket lukker begge jframes
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
vangle = vangle + 10;
System.out.println("angle:" + vangle);
}
});
}
public static class FractalTree extends JFrame {
public FractalTree() {
super("Fractal Tree");
setBounds(100, 100, 800, 600);
setResizable(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); /* stopper når den lukker, lukker begge Jframes */
}
public static void drawTree(Graphics g, int x1, int y1, double angle, int depth) {
if (depth == 0) return;
int x2 = x1 + (int) (Math.cos(Math.toRadians(angle)) * depth * 10.0); /* skifter størelsen på den */
int y2 = y1 + (int) (Math.sin(Math.toRadians(angle)) * depth * 10.0);
g.drawLine(x1, y1, x2, y2);
drawTree(g, x2, y2, angle - vangle, depth - 1); /* skifter vinklen */
drawTree(g, x2, y2, angle + vangle, depth - 1);
}
@Override
public void paint(Graphics g) {
g.setColor(Color.blue); /* skifter farven */
drawTree(g, 400, 500, -90, 9);
}
}
}
您需要在 FractalTree 上调用 repaint();
。为此,您需要对其进行引用,例如
final FractalTree tree = new FractalTree();
tree.setVisible(true);
然后你的方法变成:-
public void actionPerformed(ActionEvent e) {
vangle = vangle + 10;
System.out.println("angle:" + vangle);
tree.repaint();
}
最后一点,您需要先清除之前绘制的树,否则您的新树将绘制在旧树的顶部。
编辑:OP 的代码显然有很多问题,可以完全重写;但是我的理解(根据 https://meta.stackexchange.com/questions/266572/answer-question-or-improve-code )是 SO 的主要目的是回答用户的特定问题,我的回答旨在做到这一点。
你整个代码的结构是错误的。只要您使用静态变量和方法,您就知道您遇到了设计问题。
您不应覆盖 JFrame 上的 paint()。相反,您应该覆盖 JPanel 上的 paintComponent()
并将面板添加到框架中。
任何时候你改变一个属性的值用于class你需要调用repaint()
.
我建议您重新开始并阅读 Custom Painting 上的 Swing 教程部分以获取更多信息和工作示例。
从工作示例开始,根据您的要求修改代码。该示例将向您展示如何在实际执行绘画的 class 中定义控制绘画属性的变量。
我当前的程序有这个问题;我根本不知道如何 "refresh" JFrame 以便它正确显示对变量 vangle 的更改。我当然导入了所有正确的文件。使用 JPanel 而不是 JFrame 有什么优势吗?请全力以赴! :)
public class projekt {
static int vangle = 20;
public static void main(String args[]) {new FractalTree().setVisible(true);
JFrame frame = new JFrame();
JButton b1 = new JButton();
frame.setSize(200, 100);
b1.setSize(20, 20);
b1.setVisible(true);
b1.setText("vinklen + 10");
frame.add(b1);
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //stoppe når jframen bliver lukket lukker begge jframes
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
vangle = vangle + 10;
System.out.println("angle:" + vangle);
}
});
}
public static class FractalTree extends JFrame {
public FractalTree() {
super("Fractal Tree");
setBounds(100, 100, 800, 600);
setResizable(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); /* stopper når den lukker, lukker begge Jframes */
}
public static void drawTree(Graphics g, int x1, int y1, double angle, int depth) {
if (depth == 0) return;
int x2 = x1 + (int) (Math.cos(Math.toRadians(angle)) * depth * 10.0); /* skifter størelsen på den */
int y2 = y1 + (int) (Math.sin(Math.toRadians(angle)) * depth * 10.0);
g.drawLine(x1, y1, x2, y2);
drawTree(g, x2, y2, angle - vangle, depth - 1); /* skifter vinklen */
drawTree(g, x2, y2, angle + vangle, depth - 1);
}
@Override
public void paint(Graphics g) {
g.setColor(Color.blue); /* skifter farven */
drawTree(g, 400, 500, -90, 9);
}
}
}
您需要在 FractalTree 上调用 repaint();
。为此,您需要对其进行引用,例如
final FractalTree tree = new FractalTree();
tree.setVisible(true);
然后你的方法变成:-
public void actionPerformed(ActionEvent e) {
vangle = vangle + 10;
System.out.println("angle:" + vangle);
tree.repaint();
}
最后一点,您需要先清除之前绘制的树,否则您的新树将绘制在旧树的顶部。
编辑:OP 的代码显然有很多问题,可以完全重写;但是我的理解(根据 https://meta.stackexchange.com/questions/266572/answer-question-or-improve-code )是 SO 的主要目的是回答用户的特定问题,我的回答旨在做到这一点。
你整个代码的结构是错误的。只要您使用静态变量和方法,您就知道您遇到了设计问题。
您不应覆盖 JFrame 上的 paint()。相反,您应该覆盖 JPanel 上的
paintComponent()
并将面板添加到框架中。任何时候你改变一个属性的值用于class你需要调用
repaint()
.
我建议您重新开始并阅读 Custom Painting 上的 Swing 教程部分以获取更多信息和工作示例。
从工作示例开始,根据您的要求修改代码。该示例将向您展示如何在实际执行绘画的 class 中定义控制绘画属性的变量。