2015-01-31 38 views
0

我已經創建了一個Java項目,並在主屏幕上它應該顯示項目內的文本文件的內容。這在Eclipse中正常工作,但在導出到可運行jar文件時不起作用。這裏是什麼樣子在Eclipse:enter image description hereJava程序不顯示文本文件在罐子裏的內容

下面是它看起來像在運行的JAR文件:

enter image description here

這裏是代碼:

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Image; 
import java.awt.Insets; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 

import javax.sound.sampled.Clip; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.SwingConstants; 

public class HomeFrame { 

static JPanel panel; 
public static JPanel p2; 
private static JButton play = new JButton("Play"); 
File patch = new File(Main.class.getResource("/counter/res/ResourceCounterPatchNotes.txt").getFile()); 
private static JButton twitter; 
private static JButton mute; 
private static JButton info; 
private static JButton themeChooser; 
private static JLabel stoneLogs; 

//private static JLabel text; 
public static JLabel greet = new JLabel("", SwingConstants.CENTER); 

static JFrame frame = new JFrame("Resource Counter - Home (by Grayson S)"); { 
frame.setSize(800, 520); 
frame.setLocationRelativeTo(null); 
frame.setResizable(false); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.repaint(); 
frame.revalidate(); 

createView(); 
} 

private void createView() { 
setIcon(); 

panel = new JPanel(); 
frame.getContentPane().add(panel); 
play.setPreferredSize(new Dimension(200, 70)); 
p2 = new JPanel(); 
frame.getContentPane().add(p2); 
p2.setLayout(new GridBagLayout()); 

play.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     try { 
      Thread.sleep(500); 
     } catch(InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
     } 
     SelectionFrame.frame1.setVisible(true); 
     frame.setVisible(false); 
    } 

}); 

p2.setLayout(new GridBagLayout()); 
p2.setBackground(Color.BLACK); //sets the background color. 
GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridx = 0; 
gbc.gridy = 0; 
gbc.gridheight = GridBagConstraints.REMAINDER; 
gbc.weightx = 1; 
gbc.anchor = GridBagConstraints.CENTER; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
gbc.insets = new Insets(0, 8, 0, 0); 

JTextArea ta = new JTextArea(10, 20); 
ta.setForeground(Color.WHITE); 
ta.setBackground(Color.BLACK); 
ta.setFont(new Font("Lucida Sans", Font.PLAIN, 12)); 
//ta.setMargin(new Insets(12, 12, 12, 12)); 
p2.add(ta, gbc); 
//gbc.fill = GridBagConstraints.VERTICAL; 
play.setFont(new Font("Segoe UI", Font.BOLD, 16)); 

gbc = new GridBagConstraints(); 
gbc.gridx = 1; 
gbc.gridy = 0; 
gbc.weighty = 1; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
gbc.insets = new Insets(8, 8, 0, 5); 
gbc.anchor = GridBagConstraints.NORTH; 
p2.add(info = new JButton("Info"), gbc); 
info.setMargin(new Insets(12, 12, 12, 12)); 
gbc.gridy = 1; 
p2.add(themeChooser = new JButton("Theme Chooser"), gbc); 
themeChooser.setMargin(new Insets(12, 12, 12, 12)); 
gbc.gridy = 2; 
p2.add(twitter = new JButton("Grayson's Twitter"), gbc); 
twitter.setMargin(new Insets(12, 12, 12, 12)); 
gbc.gridy = 3; 
p2.add(mute = new JButton("Mute Music"), gbc); 
mute.setMargin(new Insets(12, 12, 12, 12)); 
gbc.gridy = 4; 
gbc.anchor = GridBagConstraints.CENTER; 
p2.add(stoneLogs = new JLabel(""), gbc); 
gbc.gridy = 5; 

Image img = new ImageIcon(this.getClass().getResource("/counter/res/Pick2.png")).getImage(); 
stoneLogs.setIcon(new ImageIcon(img)); 

themeChooser.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     ThemeFrame.frame.setLocationRelativeTo(null); 
     ThemeFrame.frame.setVisible(true); 
    } 

}); 

info.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     InfoFrame.frame.setLocationRelativeTo(null); 
     InfoFrame.frame.setVisible(true); 
    } 

}); 

mute.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (Main.clip.isRunning()) { 
      Main.clip.stop(); 
      mute.setText("Play Music"); 
     } else { 
      Main.clip.loop(Clip.LOOP_CONTINUOUSLY); 
      Main.clip.start(); 
      mute.setText("Mute Music"); 
     } 
     { 
     } 
    } 

}); 

twitter.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     try { 

      String URL = "https://twitter.com/Graysull"; 
     java.awt.Desktop.getDesktop().browse(java.net.URI.create(URL)); 

     } catch (IOException e1) { 
      e1.printStackTrace(); 
    } 

}}); 

gbc.gridx = 0; 
gbc.anchor = GridBagConstraints.SOUTH; 
gbc.weighty = 1; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
frame.add(play, BorderLayout.SOUTH); 

frame.getContentPane().setBackground(Color.GRAY); 

try { 
    ta.read(new FileReader(patch), null); 
    ta.setEditable(false); 
} catch (FileNotFoundException e1) { 
    e1.printStackTrace(); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} 


greet.setFont(new Font("Dialog", Font.BOLD, 20)); 
frame.getContentPane().add(greet, BorderLayout.NORTH); 
} 


public void setIcon() { 
    frame.setIconImage(Toolkit.getDefaultToolkit().getImage(Main.class.getResource("/counter/res/Pick.png"))); 
} 
} 

enter image description here

我該如何解決這個問題?幫助表示讚賞。

+0

可能重複(http://stackoverflow.com/questions/676097/java-resource-as-file) – MarsAtomic 2015-01-31 21:36:06

回答

1

File僅用於文件系統,不在jar中;您需要使用該資源:Class,getResourceClass,getResourceAsStream,

另外FileReader是使用默認平臺編碼的實用程序類。但是你可能會在另一臺計算機上部署該jar,然後編碼可能會不同。

最好保留UTF-8或ISO-8859-1(Latin-1)中的文本。那些始終可用。並明確提及編碼。

try (Reader in = new BufferedReader(
    new InputStreamReader(
     Main.class.getResourceAsStream(
      "/counter/res/ResourceCounterPatchNotes.txt"), 
     StandardCharsets.UTF_8))) { 
    ta.read(in); 
} 

當得到一個NullPointerException異常,路徑可能開始在錯誤的目錄,或路徑不匹配w.r.t.案子。 要檢查路徑,請打開jar(例如7zip或WinZip)。

[Java資源作爲文件]的
+0

非常感謝:d – Graysull 2015-01-31 21:56:31

0

您是否嘗試過從命令行運行您的jar(與java -jar app.jar)?這樣,您將能夠看到錯誤/異常情況,從而更好地診斷問題。