Netbeans JAR无法正常运行/打开

时间:2015-04-10 22:36:48

标签: java swing netbeans jar

我用GUI制作了一个Hangman游戏,我想为它制作一个jar。在Netbeans中,我转到Run> Clean and Build Project,它似乎构建了jar就好了。然而,当我真正去运行jar时,它所做的就是打开屏幕左上角的一个小窗口而不是我设计的GUI。虽然当我在Netbeans中运行GUI时,它会按预期打开。此外,当我尝试关闭它打开的窗口时,它实际上并没有结束java进程 - 它一直运行,直到我从任务管理器结束它。图片和代码将在下面提供。

这是我运行jar时打开的 - 一个没有任何内容的空框架。

This is what opens when I run the jar - an empty frame with nothing in it.

这是应该打开的,它是从Netbeans内部运行项目时打开的。

This is what should open

我尝试通过命令提示符运行它,它以相同的方式运行,没有错误。这是我的代码:

HangmanGUI类(主类):

package csci242.a03;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.io.FileNotFoundException;
import javax.swing.BorderFactory;
import javax.swing.JFrame;

public class HangmanGUI extends javax.swing.JFrame {

/**
 * A hangman object used for the creation of the game
 */
protected Hangman hang;

/**
 * A JLabel for displaying the text to label the currently guessed letters
 */
private javax.swing.JLabel guessedLettersInfo;

/**
 * A JLabel for displaying the text to label the number of guesses remaining
 */
private javax.swing.JLabel guessesRemainingInfo;

/**
 * A JLabel for displaying the text to label the current progress of the word
 */
private javax.swing.JLabel currentStateInfo;

/**
 * A JLabel for displaying the text to label where to enter the next letter
 */
private javax.swing.JLabel enterLetterInfo;

/**
 * A JLabel for displaying the text which says whether the user won or loss
 */
private javax.swing.JLabel winLabel;

/**
 * A JLabel for displaying what the word was if the user lost
 */
private javax.swing.JLabel wordLabel;

/**
 * A JButton for starting a new game
 */
private javax.swing.JButton newGameButton;

/**
 * A JLabel for displaying what letters have been guessed
 */
private javax.swing.JLabel guessedLettersDisplay;

/**
 * A JLabel for displaying the number of guesses remaining
 */
private javax.swing.JLabel guessesRemainingDisplay;

/**
 * A JLabel for displaying the current progress of the word being sought
 */
private javax.swing.JLabel currentStateDisplay;

/**
 * A JTextField to gather input for the next guess
 */
private javax.swing.JTextField guessTextField;

/**
 * A JPanel to draw the hangman on
 */
private csci242.a03.HangmanPanel1 hangmanPanel1;

/**
 * A JPanel used to separate the program into two halves for layout purposes 
 */
private javax.swing.JPanel rightPanel;

/**
 * A JPanel used to separate the program into two halves for layout purposes 
 */
private javax.swing.JPanel leftPanel;

/**
 * A JPanel used as a sub-container for JTextField
 */
private javax.swing.JPanel textFieldPanel;

/**
 * A JPanel used as a sub-container for winLabel and wordLabel
 */
private javax.swing.JPanel winMessagePanel;

/**
 * An empty panel to take up space in the gridLayout
 */
private javax.swing.JPanel emptyPanel1;

/**
 * An empty panel to take up space in the gridLayout
 */
private javax.swing.JPanel emptyPanel2;

/**
 * A JPanel used as a sub-container for buttonPanel
 */
private javax.swing.JPanel buttonPanel;

/**
 * A constructor for creating a new HangmanGUI frame that will house the hangman game
 * 
 */
public HangmanGUI() {
    try {
        //Create a new hangman for the game
        this.hang = new Hangman(new Lexicon("lexicon.txt"), 8);

        //Initialize all GUI components for the game
        initComponents();

        //Share the hangman object with the hangmanPanel to help draw the hangman
        hangmanPanel1.setHangman(hang);
    }
    catch (FileNotFoundException ex) {    
    }
}

/**
 * This method initializes all of the components used for displaying the game such
 * as the outer frame and any text/buttons/textFields.
 * 
 */
private void initComponents() {
    //Set up the outer frame
    setSize(1000,550);
    setLocationRelativeTo(null);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Set the frames layout to a GridLayout with 2 columns
    setLayout(new GridLayout(0,2));


    //Instantiate all of the components
    guessedLettersInfo = new javax.swing.JLabel();
    guessesRemainingInfo = new javax.swing.JLabel();
    currentStateInfo = new javax.swing.JLabel();
    enterLetterInfo = new javax.swing.JLabel();
    winLabel = new javax.swing.JLabel();
    winLabel.setVisible(false);
    wordLabel = new javax.swing.JLabel();
    wordLabel.setVisible(false);
    newGameButton = new javax.swing.JButton();
    guessedLettersDisplay = new javax.swing.JLabel();
    guessesRemainingDisplay = new javax.swing.JLabel();
    currentStateDisplay = new javax.swing.JLabel();
    guessTextField = new javax.swing.JTextField();
    hangmanPanel1 = new csci242.a03.HangmanPanel1();
    rightPanel = new javax.swing.JPanel();
    leftPanel = new javax.swing.JPanel();
    textFieldPanel = new javax.swing.JPanel();
    winMessagePanel = new javax.swing.JPanel();
    emptyPanel1 = new javax.swing.JPanel();
    emptyPanel2 = new javax.swing.JPanel();
    buttonPanel = new javax.swing.JPanel();


    //Add leftPanel and rightPanel and set each to take up half of the frame
    add(leftPanel);
    add(rightPanel);
    leftPanel.setSize(700,225);
    rightPanel.setSize(300,225);

    //Set each panel's layout based on what will be inside of them
    leftPanel.setLayout(new GridLayout(6,3));
    rightPanel.setLayout(new GridBagLayout());


    //Add guessedLettersInfo and guessedLettersDisplay to the left panel as well as set the text of each if needed
    guessedLettersInfo.setText("Letters Guessed:");
    leftPanel.add(guessedLettersInfo);
    guessedLettersInfo.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));
    leftPanel.add(guessedLettersDisplay);

    //Add guessesRemainingInfo and guessesRemainingDisplay to the left panel as well as set the text of each if needed
    guessesRemainingInfo.setText("Guesses Remaining:");
    leftPanel.add(guessesRemainingInfo);
    guessesRemainingInfo.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));
    leftPanel.add(guessesRemainingDisplay);

    //Add currentStateInfo and currentStateDisplay to the left panel as well as set the text of each if needed
    currentStateInfo.setText("Current Word Progress:");
    currentStateDisplay.setFont(new java.awt.Font("Tahoma", 0, 24));
    leftPanel.add(currentStateInfo);
    currentStateInfo.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));
    leftPanel.add(currentStateDisplay);

    //Add enterLetterInfo to the left panel as well as set the text if needed
    enterLetterInfo.setText("Enter a Letter:");
    leftPanel.add(enterLetterInfo);
    enterLetterInfo.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));


    //Set the layout of the textFieldPanel to position the textField that will be inside
    textFieldPanel.setLayout(new GridBagLayout());

    //Make a GridBagConstraints object for positioning the textField
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets(0,0,0,210);
    guessTextField.setColumns(2);

    //Add the textField to the panel then add the panel to the leftPanel
    textFieldPanel.add(guessTextField, gbc);
    leftPanel.add(textFieldPanel);


    //Set the layout of the winMessagePanel to a GridLayout with 2 rows
    winMessagePanel.setLayout(new GridLayout(2,0));

    //Set the text of each label and add them to the winMessage Panel
    winLabel.setText("Win message here");
    winMessagePanel.add(winLabel);
    winLabel.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));
    wordLabel.setText("Word here");
    winMessagePanel.add(wordLabel);
    wordLabel.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));

    //Add winMessagePanel to leftPanel
    leftPanel.add(winMessagePanel);


    //Add an emtpty panel to take up space
    leftPanel.add(emptyPanel1);


    //Set the layout of the buttonPanel, add newGameButton to the buttonPanel, and add buttonPanel to the leftPanel
    buttonPanel.setLayout(new GridBagLayout());
    newGameButton.setText("New Game");
    buttonPanel.add(newGameButton);
    leftPanel.add(buttonPanel);

    //Add an empty panel to take up space
    leftPanel.add(emptyPanel2);


    //Set the insets for the hangmanPanel as well as the prefered/minimum size
    gbc.insets = new Insets(0,0,-50,0);
    hangmanPanel1.setPreferredSize(new Dimension(300,450));
    hangmanPanel1.setMinimumSize(new Dimension(300,450));

    //Add the hangmanPanel to the right Panel with the insets defined above
    rightPanel.add(hangmanPanel1, gbc);


    //Create a new action lister for the textField
    guessTextField.addActionListener(new java.awt.event.ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            guessTextFieldActionPerformed(evt);
        }
    });

    //Create a new action lister for the new game button
    newGameButton.addActionListener(new java.awt.event.ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            newGameButtonActionPerformed(evt);
        }
    });

    //Make the frame visible
    setVisible(true);
}

/**
 * This method updates the game when a user enters something in the text field.
 * The display is also updated.
 * 
 * @param evt An event passed into the action listener
 */
private void guessTextFieldActionPerformed(java.awt.event.ActionEvent evt) {                                               
    char guess; //Make a character to hold the guess
    if (!(hang.gameOver())) {
        try {
            //Grab the first character of whatever is entered in the textField and assign it to guess
            guess = Character.toUpperCase(guessTextField.getText().charAt(0));

            //Update the game
            hang.update(guess);

            //Update the display
            updateDisplay();

            //Set the textField to be empty again
            guessTextField.setText("");
        }
        catch (StringIndexOutOfBoundsException ex) {
            guessTextField.setText("");
        }
    }
    //Repaint the hangman
    hangmanPanel1.repaint();     
}                                              

/**
 * This method creates a new hangman game when the hangman button is pressed
 * and updates the game/display along with it.
 * 
 * @param evt An event passed into the action listener
 */
private void newGameButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    try {
        //Make a new hangman
        hang = new Hangman(new Lexicon("lexicon.txt"), 8);

        //Share the new hangman with the hangmanPanel
        hangmanPanel1.setHangman(hang);
        guessTextField.setText("");

        //Make a new character set to null used for setting up the next game
        char guess = '\u0000';

        //Update the game
        hang.update(guess);

        //Update the display for the new game
        updateDisplay();
    }
    catch (FileNotFoundException ex) {  
    }
    //Repaint the hangman to restart the game
    hangmanPanel1.repaint();
}                                             

/**
 * This method updates the display to display the guessedLetters, guesses 
 * remaining, and currentState in the game. In addition to that, it also 
 * displays a message if the user has won or lost the game.
 * 
 */
public void updateDisplay() {

    winLabel.setVisible(false);
    wordLabel.setVisible(false);

    //Update the values for guessedLetters, guessesRemaining, and currentState
    guessedLettersDisplay.setText(hang.getGuessedLetters().toString());
    guessesRemainingDisplay.setText(Integer.toString(hang.getIncorrectGuessesRemaining()));
    currentStateDisplay.setText(hang.getCurrentState());

    //Create new font objects
    Font winFont = winLabel.getFont();
    Font wordFont = wordLabel.getFont();

    //Create a new color - the Color.GREEN is too flourescent/bright - this one shows up better in the frame
    Color darkGreen = new Color(0,100,0);

    //Checks to how the game is over if it has ended and displays the appropriate message
    if (hang.incorrectGuesses >= hang.allowedGuesses) {
            winLabel.setText("You have run out of guesses!");
            winLabel.setForeground(Color.red);
            winLabel.setFont(new Font(winFont.getFontName(), Font.BOLD, winFont.getSize()));
            winLabel.setVisible(true);
            wordLabel.setText("The word was: " + hang.getWord());
            wordLabel.setFont(new Font(wordFont.getFontName(), Font.BOLD, wordFont.getSize()));
            wordLabel.setVisible(true);
    } else if (hang.currentState.equalsIgnoreCase(hang.getWord())){
            winLabel.setText("You win!");
            winLabel.setForeground(darkGreen);
            winLabel.setFont(new Font(winFont.getFontName(), Font.BOLD, winFont.getSize()));
            winLabel.setVisible(true);
    }
}

/**
 * 
 * @param args 
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(HangmanGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(HangmanGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(HangmanGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(HangmanGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new HangmanGUI().setVisible(true);
        }
    });
}
}

绘制刽子手的小组:

package csci242.a03;

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;

public class HangmanPanel1 extends javax.swing.JPanel {

/**
 * A hangman object used for the drawing of the hangman
 * 
 */
protected Hangman hang;

/**
 * A constructor for creating a panel that will house the hangman and gallows
 * 
 */
public HangmanPanel1() {
    initComponents();
}

/**
 * This method sets the Hangman instance variable to a new value.
 * 
 * @param hang A new hangman object
 */
public void setHangman(Hangman hang) {
    this.hang = hang;
}

/**
 * This method draws the gallows for the hangman as well as the head,
 * arms, legs, and feet depending on the number of incorrect guesses that
 * have been made.
 * 
 * @param g A graphics object
 */
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (this.hang != null) {
        if (hang.getIncorrectGuessesMade() >= 0) {

            //Draw the gallows
            Graphics2D g2 = (Graphics2D)g;
            g2.setStroke(new BasicStroke(9));
            g2.draw(new Line2D.Float(0,0,0,450));
            g2.draw(new Line2D.Float(0,0,150,0));
            g2.setStroke(new BasicStroke(5));              
            g2.draw(new Line2D.Float(152,0,152,50));
            g2.draw(new Line2D.Float(0,350,450,350));
            g2.draw(new Line2D.Float(150,350,150,450));
            g2.draw(new Line2D.Float(297,350,297,450));
            g2.draw(new Line2D.Float(0,350,150,450));
            g2.draw(new Line2D.Float(150,351,297,450));                
            g2.draw(new Line2D.Float(150,351,0,450));
            g2.draw(new Line2D.Float(150,450,300,350));
            g2.setStroke(new BasicStroke(1));

            //Draw the head/face if there is 1 incorrect guess
            if (hang.getIncorrectGuessesMade() >= 1) {
                g.drawOval(127,51,50,50);
                g.fillOval(137,61,10,10);
                g.fillOval(157,61,10,10);
                g.drawLine(137, 81, 167, 81);

                //Draw the torso if there are 2 incorrect guesses
                if (hang.getIncorrectGuessesMade() >= 2) {
                    g.drawRoundRect(127,101,50,100,30,30);

                    //Draw the left arm if there are 3 incorrect guesses
                    if (hang.getIncorrectGuessesMade() >= 3) {
                        g.drawLine(127, 110, 100, 175);

                        //Draw the right arm if there are 4 incorrect guesses
                        if (hang.getIncorrectGuessesMade() >= 4) {
                            g.drawLine(177, 110, 205, 175);

                            //Draw the left leg if there are 5 incorrect guesses
                            if (hang.getIncorrectGuessesMade() >= 5) {
                                g.drawLine(127, 190, 127, 270);

                                //Draw the right leg if there are 6 incorrect guesses
                                if (hang.getIncorrectGuessesMade() >= 6) {
                                    g.drawLine(177, 190, 177, 270);

                                    //Draw the left foot if there are 7 incorrect guesses
                                    if (hang.getIncorrectGuessesMade() >= 7) {
                                        g.drawRoundRect(100,268,27,10,10,10);

                                        //Draw the right foot if there are 8 incorrect guesses
                                        if (hang.getIncorrectGuessesMade() >= 8) {
                                            g.drawRoundRect(177,268,27,10,10,10);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }       
        }
    }
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );
}// </editor-fold>                        

// Variables declaration - do not modify                     
// End of variables declaration                   
}

还有另外两个类,但我认为它们不会导致问题。由于30,000个字符限制,我也无法在OP中发帖。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

尝试减少您提交的内容,但遗憾的是,没有人想要对您的代码进行筛选,因此您无法获得答案