JFrame问题。这使得我需要的窗口数量增加了一倍

时间:2016-09-21 23:25:40

标签: java swing jframe

我还有两个这个主类正在使用的类,但我认为没有这些类就可以回答它,因为我认为这是一个逻辑问题。

我试图创建一个打印出图纸的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);
        }
        }

    }

2 个答案:

答案 0 :(得分:2)

您的代码有多处错误:

  1. 它扩展了JFrame并创建了一个JFrame对象(只需从课程中移除extends JFrame,建议这样做)

  2. 这就是你的问题:

    Viewer v = new Viewer("Trey Wilson", n);
    

    这会调用Viewer的类构造函数,但是构造函数本身会设置它自己的标题,大小等,然后你修改这些属性并再次调用setVisible(true)这使得它最后框架再次可见,所以删除其中一个。

  3. 您没有将您的计划放在EDT上,请参阅SwingUtilities.invokeLater() why is it needed?

  4. 请参阅The use of multiple JFrames, Good / Bad Practice?(错误),您应该尝试使用单个JFrame与多个JPanels切换Card Layout或使用{{3}向/从用户显示/检索信息

  5. 根据您的评论:

      

    我对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);。但根据您的要求,选择最适合自己的。