【问题标题】:Compiles and runs but it's not there编译并运行,但它不存在
【发布时间】:2011-12-17 23:08:24
【问题描述】:

我正在尝试从包文件夹中运行我的 JFrames(该文件夹有效且已正确设置)。问题是它可以编译并运行,但我什么都看不到,而且我不知道要修复什么,因为没有错误。我可能忽略了一些非常小的东西,但我无法确定它。这段代码是我的 Main 类,也是我将要使用的第一个 JFrame 类。任何关于如何最有效地从包中实现 JFrame 的想法都将不胜感激。

import GroupProject.GUI.Package.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;


public class TestGuiApp1
{

    public static void main(String[] Args)
    {
      // Gets screen dimensions to be used to center JFrame
      Toolkit tk = Toolkit.getDefaultToolkit();
      Dimension d = tk.getScreenSize();

      //creates new Main Menu Frame from GUI packages
      new MainMenuFrame();

      //constraints and unlocking/locking features
      //setLocation((d.width/2)-350, (d.height/2)-350);
      //setResizable(false);


    }

}

//从包中开始 JFrame 类

    package GroupProject.GUI.Package;

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import com.sun.java.swing.plaf.nimbus.*;

    public class MainMenuFrame extends JFrame
    {
        private JButton guess_word,
                        guess_number,
                        player_stats;
        private JLabel pic_label = new JLabel(new ImageIcon("Question-Mark-Man.jpg"));

        public MainMenuFrame()
        {     

            try {

                UIManager.setLookAndFeel(new NimbusLookAndFeel()
                {
                    public UIDefaults getDefaults()
                    { 
                        UIDefaults ret = super.getDefaults();
                        ret.put("defaultFont",
                        new Font(Font.MONOSPACED, Font.BOLD, 16));
                        return ret;
                }
                });

            JPanel p1 = new JPanel();
            JPanel p2 = new JPanel();

            ButtonListener listener = new ButtonListener();
            // Panel Size
            setPreferredSize(new Dimension(550, 300));
            // Background Color
            setBackground(new Color(127, 157, 217));
            p1.setBackground(new Color(127, 157, 217));


            // -------------------- Buttons -------------------

            // Guess a word Button
            guess_word = new JButton("Guess a word", new ImageIcon("word game.png"));
            guess_word.setFont(new Font("ariel narrow",Font.BOLD,24));
            guess_word.addActionListener(listener);
            p1.add(guess_word);

            // Guess a number Button
            guess_number = new JButton("Guess a number", new ImageIcon("number game.png"));
            guess_number.setFont(new Font("ariel narrow",Font.BOLD,24));
            guess_number.addActionListener(listener);
            p1.add(guess_number);

            // View player stats button
            player_stats = new JButton("Player Stats", new ImageIcon("stats2.png"));
            player_stats.setFont(new Font("ariel narrow",Font.BOLD,24));
            player_stats.addActionListener(listener);
            p1.add(player_stats);
            // ---------------------------------------------------



            // ============ Layouts using group layout ============
            GroupLayout layout = new GroupLayout(this);

            this.setLayout(layout);
             layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false)
                    .addComponent(guess_word, GroupLayout.PREFERRED_SIZE, 280,
                          GroupLayout.PREFERRED_SIZE)
                    .addComponent(guess_number, GroupLayout.PREFERRED_SIZE, 280,
                          GroupLayout.PREFERRED_SIZE)
                    .addComponent(player_stats, GroupLayout.PREFERRED_SIZE, 280,
                          GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addComponent(p2, GroupLayout.DEFAULT_SIZE,
                          GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addContainerGap()));

            layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false)
                    .addComponent(p2, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 
                              GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                    .addComponent(guess_word, GroupLayout.PREFERRED_SIZE, 60,
                         GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
                    .addComponent(guess_number, GroupLayout.PREFERRED_SIZE, 60,
                          GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
                    .addComponent(player_stats, GroupLayout.PREFERRED_SIZE, 60,
                          GroupLayout.PREFERRED_SIZE)))

                    .addContainerGap(239, Short.MAX_VALUE)));
            // ===================================================
            p2.add(pic_label);
            } catch (Exception ex)
            {
                throw new Error(ex);
            }
        }  


        private class ButtonListener implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {   
               //need to set values to remember what game the user wants to play
               // before it goes to the SelectPlayerTypeFrame
               if (e.getSource() == guess_word)
                   ;//new MainMenu();

               if (e.getSource() == guess_number)
                   ; // new MainMenu();

               if (e.getSource() == player_stats)
               ;//new MainMenu(); 
            } 
        }

    }

【问题讨论】:

  • 啊,我发现 GroupLayout 使用了 this 关键字,需要 getContentPane() 代替。

标签: java swing user-interface package jframe


【解决方案1】:

您永远不会将您的框架设置为可见,并且您不会在其上调用pack() 来告诉它调整其子组件的大小。

JFrame frame = new MainMenuFrame();
frame.pack();
frame.setVisible(true);

【讨论】:

  • 最初我试过这个,但是,我遇到了一个运行时错误...... GroupLayout 一次只能与一个容器一起使用
【解决方案2】:

你在 JFrame 的哪里调用 setVisible(true)?

即,

myFrame.setVisible(true);

或者在你的情况下:

this.setVisible(true); // this is not necessary but here for clarity

另请注意,应在将所有组件添加到 GUI 并在调用 pack 之后调用它(如本页另一个答案中所述)。

您将需要阅读 Java Swing 教程以了解如何创建 Swing 程序,因为这些知识对您非常有用:Swing Tutorials

另外,我强烈建议您不要使用 NetBeans 为您生成 Swing 代码,至少不要在游戏的这个阶段,直到您对 Swing 有了更多了解。代码生成器非常适合快速和肮脏的代码创建,但如果您不了解 Swing 的具体细节,如果您想要创建的不仅仅是最基本的 GUI,您通常会遇到困难。我从经验中知道这一点。

【讨论】:

  • 最初我试过这个,但是,我遇到了一个运行时错误...... GroupLayout 一次只能与一个容器一起使用
  • 这意味着您使用 GroupLayout 错误。解决方案:不要使用 NetBeans 生成的代码。而是使用教程作为指南创建您自己的 Swing 代码。这包括尽可能使用更易于使用的布局管理器。
猜你喜欢
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2012-04-27
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多