【问题标题】:How to distribute a java GUI builder project [duplicate]如何分发java GUI builder项目[重复]
【发布时间】:2014-10-28 22:00:28
【问题描述】:

目前我分发的其他人从 java 运行时环境中获取“发生 Java 异常”。我将如何将其作为 .jar 正确分发?

package my.onis;

import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import static java.lang.Thread.sleep;
import javax.swing.JOptionPane;

public class onis extends javax.swing.JFrame
{
    public onis()
    {
        initComponents();
    }

    public int oxygen = 100;

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        btn = new javax.swing.JLabel();
        pb = new javax.swing.JProgressBar();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("One Night In Space");
        setAlwaysOnTop(true);
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowActivated(java.awt.event.WindowEvent evt) {
                formWindowActivated(evt);
            }
        });

        jPanel1.setPreferredSize(new java.awt.Dimension(1135, 633));
        jPanel1.setLayout(null);

        btn.setIcon(new javax.swing.ImageIcon("C:\\Users\\rando_000\\Desktop\\butt.png")); // NOI18N
        btn.setPreferredSize(new java.awt.Dimension(200, 100));
        btn.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnMouseClicked(evt);
            }
        });
        jPanel1.add(btn);
        btn.setBounds(430, 200, 200, 100);

        pb.setBackground(new java.awt.Color(0, 0, 0));
        pb.setForeground(new java.awt.Color(255, 255, 51));
        pb.setValue(oxygen);
        pb.setBorderPainted(false);
        pb.setFocusable(false);
        pb.setStringPainted(true);
        jPanel1.add(pb);
        pb.setBounds(30, 564, 280, 30);

        jLabel2.setIcon(new javax.swing.ImageIcon("C:\\Users\\rando_000\\Desktop\\Background.jpeg")); // NOI18N
        jPanel1.add(jLabel2);
        jLabel2.setBounds(0, 0, 1051, 633);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 1051, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
        setLocationRelativeTo(null);
    }// </editor-fold>                        

    private void btnMouseClicked(java.awt.event.MouseEvent evt) {                                 
        try{BufferedImage image = javax.imageio.ImageIO.read(new java.io.File("C:\\Users\\rando_000\\Desktop\\butt.png"));
        boolean transparent = (image.getRGB(evt.getX(),evt.getY()) & 0x00ffffff)==0;
        if(!transparent)
        {
            mousePressed(evt);
        }}catch(IOException e){};
    }                                

    private void formWindowActivated(java.awt.event.WindowEvent evt) {                                     
        check();
    }                                    
    public void mousePressed(MouseEvent e) 
    {
    if(e.getButton() == MouseEvent.BUTTON1 && oxygen > 0)
    {
            oxygen -= 10;
    }
    else if(e.getButton() == MouseEvent.BUTTON3 && oxygen < 100)
    {
        oxygen += 10;
    }
    }
    public void startUpdating()
    {
        for (int j = 0; j < 1000000; j++)
        {

            pb.setValue(oxygen);

            if (oxygen <= 0)
            {
                JOptionPane.showMessageDialog(this, "You have died.");
                System.exit(0);
            }

            try{sleep(10);}catch(InterruptedException e){};
        }
    }
    public void check()
    {
        Thread update = new Thread()
        {
            public void run()
            {
                startUpdating();
            }
        };
        update.start();
    }
    public static void main(String args[])
    {
        //<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(onis.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(onis.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(onis.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(onis.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new onis().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JLabel btn;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    public javax.swing.JProgressBar pb;
    // End of variables declaration                   
}

这是显示我的项目文件和类路径的屏幕截图

【问题讨论】:

  • 你有堆栈跟踪吗?将其添加到您的问题中。
  • This:catch(IOException e){}; 是您可以在 Java 程序中放置的最糟糕的东西之一。严重地。始终处理您的异常。总是。
  • 您的 GUI 将图像文件作为文件从硬编码文件路径访问,我确信您朋友的计算机没有相同的路径。不要这样做,而是将您的图像与您的 jar 文件打包并作为资源而不是文件访问它们。如果你搜索这个网站,你会发现如何做到这一点。再次,处理您的异常,因为这可能会使您和您的朋友对错误的实际来源视而不见。你的空catch块不是送给你的朋友的好东西。
  • @Hovercraft Full Of Eels - 非常好。但是,使用 cmets 回答问题对 OP 以外的任何人都没有多大帮助。
  • @StuPointerException:我开始写答案,但我在工作,没有时间写我认为足够的答案,恐怕包括资源的处理和放置.如果您有时间,我将不胜感激。

标签: java swing user-interface compilation builder


【解决方案1】:

正如您问题下方的 cmets 所指出的,错误的最明显原因是您所依赖的资源是使用绝对地址引用的。这基本上意味着您的程序将无效,除非客户端与您的开发机器具有完全相同的配置。

要使您的应用程序可分发,您应该将资源打包到 JAR 文件中。这个问题有一些有用的提示:

Java Path ImageIcon URL .JAR

顺便说一句,发生异常时抛出的堆栈跟踪在诊断错误时非常宝贵。您绝对应该将它与关于 SO 的任何进一步问题一起发布。不要用这样的代码吞下异常:

try {
    doSomethingWhichMightFail();
} catch(Exception e) {

}

除非您绝对确定异常是无关紧要的(这非常罕见!)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2017-05-28
    • 2012-08-13
    相关资源
    最近更新 更多