当前位置: 首页 > 面试题库 >

第二个JFrame中的组件未显示

黄朗
2023-03-14
问题内容

我想通过按下JFrame中的按钮来启动另一个JFrame。但是,如果按Button,它将显示JFrame,但其中不显示Buttons和Sliders。

public class MainMenu extends JFrame {


private JFrame klick;
private static final long serialVersionUID = 9002;


public static void main(String[] args) {

    new MainMenu();

}


public MainMenu() {
    buildGUI1();

}
public void buildGUI1() throws NullPointerException {
    setTitle("Hauptmenü");      
    setSize(800, 480);
    setLayout(new GridLayout());
    setAlwaysOnTop(false);
    setLocation((Toolkit.getDefaultToolkit().getScreenSize().width)/4, (Toolkit.getDefaultToolkit().getScreenSize().height)/4);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    setVisible(true);
    final JButton startclickbt = new JButton("Start Clicker");
    startclickbt.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            dispose();
            if(klick == null ) {
                klick =new Clicker();
                add(klick);
            }


        }
    });

    add(startclickbt);


    }

}

第二个具有完全相同的构造函数。滑块和按钮不是静态的。在应显示“按钮”的位置,屏幕为黑色。

希望你能帮我 :)

编辑:

public class Clicker extends JFrame {

    private static final long serialVersionUID = 9001;
    protected JPanel panel;
    static Click j = null;
    protected JSlider jsl;
    protected JTextField tf;
    static final int CPS_MIN= 0;
    static final int CPS_MAX= 100;
    static final int CPS_INIT= 25;
    private int amount;
    private boolean visible;

    public int getDelay() {
        return Math.abs(jsl.getValue()-100);
    }
    public int getAmount() {
        return amount;
    }
    public boolean getVisible() {
        return visible;
    }
    public void setOpen(boolean visible) {
        this.visible=visible;
    }

    public Clicker(boolean visible) {

        buildGUI(visible);
        j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width)/2, (Toolkit.getDefaultToolkit().getScreenSize().height)/2)).addPosition(new Point(getLocation().x+1, getLocation().y+20));
        while(true) {

            j.runClicks(getDelay());
        }
    }

    public Clicker() {
        buildGUI(true);
        j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width)/2, (Toolkit.getDefaultToolkit().getScreenSize().height)/2)).addPosition(new Point(getLocation().x+1, getLocation().y+20));
        while(true) {

            j.runClicks(getDelay());
        }
    }
    public void buildGUI(boolean visible) {

        setTitle("Clicker");
        setSize(340, 200);
        setLayout(new GridLayout());
        setAlwaysOnTop(true);
        setLocation(0, 0);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(visible);

        final JButton bt1 = new JButton("Schließen");
        bt1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        final JButton bt2 = new JButton("Start  ");
        bt2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                j.setClick(true);
            }
        });
        final JButton bt3 = new JButton("Stop       ");
        bt3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                j.setClick(false);
                JOptionPane.showMessageDialog(null, "Klicken gestoppt. Klicks: " + j.getClickAmount());
                j.setClickAmout(0);
            }
        });
        final JButton bt4 = new JButton("StartAnzahl");
        bt4.addActionListener(new ActionListener() {
            private int amount;

            public void actionPerformed(ActionEvent e) {
                String wert = tf.getText();
                try {
                    amount = Integer.parseInt(wert);
                }catch(Exception ee) {
                    JOptionPane.showMessageDialog(null,"Das war keine Zahl oder mehr als ein Integer");
                }

                j.doClick(amount);


            }
        });
        tf = new JTextField("Anzahl gewünschte Clicks max "+ Integer.MAX_VALUE, 10);
        tf.setEditable(true);


        jsl = new JSlider(JSlider.HORIZONTAL,CPS_MIN,CPS_MAX,CPS_INIT);
        jsl.setMinorTickSpacing(5);
        jsl.setMajorTickSpacing(10);
        jsl.setPaintTicks(true);
        jsl.setPaintLabels(true);

        panel = new JPanel();
        panel.addMouseMotionListener(new MouseMotionListener() {

            @Override
            public void mouseDragged(MouseEvent event) {
                j.setClick(false);  
            }

            @Override
            public void mouseMoved(MouseEvent event) {
                j.setClick(false);          
            }
        });

        panel.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_F1) {
                    j.setClick(true);
                }
                if(e.getKeyCode() == KeyEvent.VK_F2) {
                    j.setClick(false);
                }
            }

        });


        add(panel);
        add(bt2);
        add(bt3);
        add(bt1);
        add(bt4);
        add(jsl);
        add(tf);

        pack();
    }

}

问题答案:

setVisible你最后一件事…

public void buildGUI1() throws NullPointerException {
    setTitle("Hauptmenü");
    setSize(800, 480);
    setLayout(new GridLayout());
    setAlwaysOnTop(false);
    setLocation((Toolkit.getDefaultToolkit().getScreenSize().width) / 4, (Toolkit.getDefaultToolkit().getScreenSize().height) / 4);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    final JButton startclickbt = new JButton("Start Clicker");
    startclickbt.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            dispose();
            if (klick == null) {
                klick = new Clicker();
                add(klick);
                // Add this when you need to add/remove components
                revalidate();
                repaint();
            }

        }
    });

    add(startclickbt);
    // Move to here
    setVisible(true);

}

另外,在添加新组件时,使用revalidate()repaint()鼓励容器更新其布局。

建议:

  • 确保您的用户界面在EDT上下文中启动,有关更多详细信息,请参见初始线程。
  • 避免直接从顶级容器(如)扩展JFrame,而应考虑JPanel在基础容器中使用a 。这样可以将您的UI释放到更多用例中,并防止您被锁定(因为您无法将框架添加到其他框架)
  • 使用多个JFrame,良好/不良做法?

更新

你有两个直接的问题

  1. Clicker从扩展JFrame,但是您尝试将其添加到另一个容器中,这在Swing中是不可能的,并且会导致异常,但是…
  2. 您正在使用while (true)循环来阻塞事件调度线程,这意味着Swing无法处理任何新事件,包括repaint事件

例如…

public Clicker(boolean visible) {

    buildGUI(visible);
    j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height) / 2)).addPosition(new Point(getLocation().x + 1, getLocation().y + 20));
    // This is bad
    while (true) {

        j.runClicks(getDelay());
    }
}

public Clicker() {
    buildGUI(true);
    j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height) / 2)).addPosition(new Point(getLocation().x + 1, getLocation().y + 20));
    // This is bad
    while (true) {

        j.runClicks(getDelay());
    }
}

现在,Click看起来好像它的UI组件带来了很多其他问题,但是我们没有相应的代码,因此无法注释。

立即的解决方案可能是使用:

  • SwingWorker,请参阅工作线程和SwingWorker了解更多详细信息

  • Swing Timer,有关更多详细信息,请参见如何使用Swing计时器

  • 普通老 Thread

要记住的事情

  • Swing(像大多数UI框架一样)是单线程的,任何阻塞该线程的事物(如永无休止的循环)都将阻止它处理新事件,包括绘画事件,这会使您的应用程序看起来像是“挂起”,因为它具有
  • 摆动不是线程安全的。与UI的所有交互都必须在事件分发线程的上下文内进行。无论SwingWorker和Swing Timer提供安全更新UI的能力。


 类似资料:
  • 我知道同样的问题已经被问过很多次了,但是我似乎真的没有在我的代码中发现阻碍JPanel类型的对象显示在JFrame中的错误。下面是扩展JFrame的类的构造函数: 当我运行main方法(这里没有显示)时,它只显示框架和按钮。如果有人能在这方面给点提示,我会非常感谢的。

  • 我已经在我的 JFrame 中添加了一个自定义 JPane 和一个自定义 JMenuBar。JPane显示得很好,但JMenuBar不是。我已经在不同的类中定义了框架和菜单栏 下面是frame类:public类pixel frame {//这个框架将保存用于艺术创作的a pixelPane。这也将包含一个菜单栏,在另一个文件中定义。pixelPane编辑区域;pixelMenuBar菜单栏;pub

  • 问题内容: 我正在有限的时间里进行学校项目,导致代码混乱和混乱。我正在尝试打开两个jFrame,一个显示聊天界面,另一个显示图像。从第一个窗口调用时,我想调用一个方法,该方法多次更改第二个窗口上的图像,并且之间有一些延迟。但是,图像不会改变。 我认为我的问题是由于在文本窗口中使用了一些示例代码,并试图合并我自己的修改而没有完全理解前者。在尝试查找此问题时,我仅发现人们根据计时器和in来更新其jFr

  • 我使用iTextPDF生成PDF,从一些文本输入中获取数据。 当我运行应用程序并创建第一个PDF时,它会按预期生成。 然后我改变一些值并生成另一个值,这就是问题所在。第一个PDF上显示的最后一个条目被打印在第二个生成的PDF的第一个条目的顶部。 不知道为什么会这样?它是保存到缓冲区还是什么的,不是很确定。 下面是生成PDF的代码: 输出请见附件图像,第一个显示第一个文件生成,第二个显示第二个文件生

  • 这是我的代码,当我执行时,我得到的只是一个空白窗口。首先,当我尝试执行时,我得到了这个错误: “无法对非静态字段面板进行静态引用” 所以我把它放在构造器中,但什么都不会显示。

  • 一个没有显示添加到它的的问题。我已经尝试了,我已经切换到只添加,以使代码更短一些。任何帮助都是非常感谢的!