我还有两个这个主类正在使用的类,但我认为没有这些类就可以回答它,因为我认为这是一个逻辑问题。
我试图创建一个打印出图纸的JFrame
。 API的设置方式,我希望public Viewer
创建框架并设置标题,然后main
来实例化查看器。但是我设置这种方式的方式可以使我需要的帧数增加一倍。此外,当我尝试连接
v.setTitle(v.getTitle() + String.format(" pi = %.4f", pi));
它没有用。它只是打印一个新的JFrame
只有
String.format(" pi = %.4f", pi));
并且原始JFrame
打印其名称(两个单独的帧)。所以我知道它必须是某个地方的逻辑问题,但我无法弄明白。
import java.util.Scanner;
import javax.swing.JFrame;
public class Viewer extends JFrame{
private ControlPanel cp;
public Viewer(String name, int in){
JFrame frame = new JFrame();
frame.setSize(550, 550);
frame.setTitle("Name: " + name);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cp = new ControlPanel(in);
frame.add(cp);
frame.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
int n = (int) 1e4;
System.out.println("Enter the number of runs to make <1 to 4>:");
@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
int runs = in.nextInt();
if (runs > 4){
runs = 4;
}
if (runs < 1){
runs = 4;
}
for (int i = 1; i <= runs; i ++){
n = n * runs;
Viewer v = new Viewer("Trey Wilson", n);
int hits = v.cp.getHits();
double pi = 4.0 * hits / n;
v.setTitle(v.getTitle() + String.format(" pi = %.4f", pi));
v.pack();
v.setVisible(true);
v.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
}
答案 0 :(得分:2)
您的代码有多处错误:
它扩展了JFrame
并创建了一个JFrame
对象(只需从课程中移除extends JFrame
,建议这样做)
这就是你的问题:
Viewer v = new Viewer("Trey Wilson", n);
这会调用Viewer
的类构造函数,但是构造函数本身会设置它自己的标题,大小等,然后你修改这些属性并再次调用setVisible(true)
这使得它最后框架再次可见,所以删除其中一个。
您没有将您的计划放在EDT上,请参阅SwingUtilities.invokeLater() why is it needed?
请参阅The use of multiple JFrames, Good / Bad Practice?(错误),您应该尝试使用单个JFrame
与多个JPanels
切换Card Layout或使用{{3}向/从用户显示/检索信息
根据您的评论:
我对Jframe(以及java)完全不熟悉,并且获得了一个API。延伸意味着什么?我会给它一个谷歌,但不知道你是否有一个如何解决它的答案。
我建议您在进入Java Swing之前首先学习OOP基础知识,Java概念,这将使您的学习更加困难,因为它会增加它的复杂性,并使您难以维护或制作高质量的软件。
答案 1 :(得分:0)
这解决了双框架出现的问题:
所以你可以在构造函数中删除frame.setVisible(true);
,如:
public Viewer(String name, int in){
JFrame frame = new JFrame();
frame.setSize(550, 550);
frame.setTitle("Name: " + name);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cp = new ControlPanel(in);
frame.add(cp);
}
或者宁可从您v.setVisible(true);
方法中删除main
。
我建议你带走frame.setVisible(true);
。但根据您的要求,选择最适合自己的。