I have created an application that runs fine but when made into a jar file the image doesn't show. I'm using JAVAFX for the GUI.
Part of the code
#FXML
private ImageView weatherIconId;
public void setLocation(){
WeatherToday wT = new WeatherToday();
File file = new File("src\\weatherIcons\\"+ wT.getIcon() + ".png");
Image image = new Image(file.toURI().toString());
try {
weatherIconId.setImage(image);
loc.setText(wT.getDescription().substring(0, 1).toUpperCase() + wT.getDescription().substring(1) + " " + wT.getCels());
}catch(Exception e){
loc.setText("Error News");
}
}
Image show in executable
Image not showing in JAR File
Full code for class
public class LabelController {
#FXML
private TextArea lblN;
#FXML
private Label lblTime;
#FXML
private Label loc;
#FXML
private Label trainUpdate;
#FXML
private Label monthDay;
#FXML
private Label TFLline;
#FXML
private Label BBCL;
#FXML
private ImageView weatherIconId;
static String i;
static int num;
public void getAndSetData(){
setTime();
setNews();
setLocation();
setTrainStatus();
}
public void setTime(){
try {
LocalTime watch = LocalTime.now();
DateTimeFormatter shortTime = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
i = shortTime.format(watch);
LocalDate now = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM, dd");
String formatDate = now.format(formatter);
System.out.println("After : " + formatDate);
lblTime.setText(i);
monthDay.setText(formatDate);
}catch(Exception e){
lblTime.setText("Error T");
}
}
public void setNews(){
BBCL.setTextFill(Color.web("#ff270f"));
try {
String news = "";
for(String n: new News().getHeadLine()){
news += "- " + n + "\n";
}
//Scroll bar in the textArea
ScrollBar scrollBarv = (ScrollBar)lblN.lookup(".scroll-bar:vertical");
//Hide scrollbar
scrollBarv.setDisable(true);
lblN.setWrapText(true);
//New information.
lblN.setText(news);
lblN.appendText("\n"+ "\n"+ "\n"+ "\n");
//Automatic scrolling function
slowScrollToBottom(scrollBarv);
}catch(Exception e){
lblN.setText("Error News");
}
}
static void slowScrollToBottom(ScrollBar scrollPane) {
scrollPane.setValue(1.5);
Animation animation = new Timeline(
new KeyFrame(Duration.seconds(7),
new KeyValue(scrollPane.valueProperty(), 0)));
animation.play();
}
public void setLocation(){
WeatherToday wT = new WeatherToday();
File file = new File("src\\weatherIcons\\"+ wT.getIcon() + ".png");
Image image = new Image(file.toURI().toString());
try {
weatherIconId.setImage(image);
loc.setText(wT.getDescription().substring(0, 1).toUpperCase() + wT.getDescription().substring(1) + " " + wT.getCels());
}catch(Exception e){
loc.setText("Error News");
}
}
public void setTrainStatus(){
TFLStatus tS = new TFLStatus();
LocateMyCity lo = new LocateMyCity();
int sizeOfService = tS.getTFL().size();
int countGS = 0;
if(lo.getmyCityLocation().equalsIgnoreCase("London")) {
try {
for (Map.Entry<String, String> entry : tS.getTFL().entrySet()) {
//Line NOT equal to Good Service - Delay lines
if (!entry.getValue().equalsIgnoreCase("Good Service")) {
TFLline.setFont(new Font("Arial", 30));
TFLline.setStyle("-fx-font-weight: bold");
TFLline.setTextFill(Color.web("#ff270f"));
TFLline.setText("Services delays:");
trainUpdate.setFont(new Font("Arial", 32));
trainUpdate.setStyle("-fx-font-weight: bold");
trainUpdate.setTextFill(Color.web("#ffffff"));
trainUpdate.setText(entry.getKey() + ": " + entry.getValue() + "\n");
System.out.println("Name of Service: " + entry.getKey() + " " + entry.getValue() + "\n");
++countGS;
}
}
if (countGS == 0) {
TFLline.setFont(new Font("Arial", 35));
TFLline.setStyle("-fx-font-weight: bold");
TFLline.setTextFill(Color.web("#25d039"));
TFLline.setText("Good Services: Underground & DLR");
}
System.out.println(countGS);
//tS.getTFL().forEach((k,v)-> System.out.println(v));
} catch (Exception e) {
loc.setText("Error News");
}
}else{
TFLline.setText(lo.getmyCityLocation());
}
}
#FXML
public void initialize() {
Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(8000),
ae -> getAndSetData()));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
// getAndSetTheCurrentTime();
// lblN.textProperty().bind(i);
}
}
You can try this to laod the image
private Image image1 =
new Image(this.getClass().getResourceAsStream("/src/weatherIcons/image1.png"));
First of all, change image patches from "src/image.jpg" to "/image.jpg" and load image with help of classloader getClass().gerResource("/image.jpg") because after building jar and move it to somewhere it does not able to see src folder and your images does not shown. If it does not work check presence of images in your jar (open it with winRar or 7z file managers) and see in classpath (folder with class files) they must be there.
I also faced this issue once, and I solved like this way:
I made a img folder that consists of images. I gave the path of image to button or label etc like this way.
Now I follow this directory structure to attach images.
buttonORLabel.setGraphic(new ImageView(new Image(getClass().getResourceAsStream("/image.jpg"))));
I am writing GUI for a chat, and I have problem I can't seem to find a solution.
When button Send is clicked variable OKpressed should change to true and in function getUserInput it should recognize it changed but it doesn't..
It's acting like it still says false..
I tried printing out in Send that works, so problem is only that functiong getUserInput doesn't recognize variable as changed
Any help is appreciated..Here's the code
I can't attach all other classes so you can start it, but everything is working except the problem mentioned above
public class Chat extends Process {
public static class myFrame extends JFrame{
/** Creates a new instance of myFrame */
private JTextArea ChatBox=new JTextArea(10,45);
private JScrollPane myChatHistory=new JScrollPane(ChatBox,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
private JTextArea UserText = new JTextArea(5,40);
private JScrollPane myUserHistory=new JScrollPane(UserText,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
private JButton Send = new JButton("Send");
private JTextField User=new JTextField(20);
private String ServerName;
private String UserName;
boolean OKPressed = false;
String poruka;
public myFrame() {
setResizable(false);
setTitle("Client");
setSize(560,400);
Container cp=getContentPane();
cp.setLayout(new FlowLayout());
cp.add(new JLabel("Chat History"));
cp.add(myChatHistory);
cp.add(new JLabel("Chat Box : "));
cp.add(myUserHistory);
cp.add(Send);
cp.add(User);
Send.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
poruka=(String)UserText.getText();
OKPressed = true;
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
static myFrame t=new myFrame();
public Chat(Linker initComm) {
super(initComm);
}
public synchronized void handleMsg(Msg m, int src, String tag){
if (tag.equals("chat")) {
System.out.println("Message from " + src +":");
System.out.println(m.getMessage());
t.ChatBox.append(src + ":" + m.getMessage() + "\n");
}
}
public String getUserInput() throws Exception {
while (t.OKPressed == false){}
String chatMsg=t.poruka;
return chatMsg;
}
public IntLinkedList getDest(BufferedReader din) throws Exception {
System.out.println("Type in destination pids with -1 at end:");
System.out.println("Only one pid for synch order:");
IntLinkedList destIds = new IntLinkedList(); //dest for msg
StringTokenizer st = new StringTokenizer(din.readLine());
// StringTokenizer st = new StringTokenizer(t.poruka);
while (st.hasMoreTokens()) {
int pid = Integer.parseInt(st.nextToken());
if (pid == -1) break;
else destIds.add(pid);
}
return destIds;
}
public static void main(String[] args) throws Exception {
String baseName = "Chat";
int myId = Integer.parseInt(args[0]);
int numProc = Integer.parseInt(args[1]);
Linker comm = null;
comm = new CausalLinker(baseName, myId, numProc);
Chat c = new Chat(comm);
for (int i = 0; i < numProc; i++)
if (i != myId) (new ListenerThread(i, c)).start();
BufferedReader din = new BufferedReader(
new InputStreamReader(System.in));
while (true){
System.out.println(c.getUserInput());
String chatMsg = c.getUserInput();
if (chatMsg.equals("quit")) break;
t.ChatBox.append(myId + ": " + chatMsg +"\n");
IntLinkedList destIds = c.getDest(din);
comm.multicast(destIds, "chat", chatMsg);
}
}
}
As you wrote, I cannot run you code, so it is kind of guess, however I think the problem is in empty infinite loop:
while (t.OKPressed == false){}
if you add anything inside, even:
while(t.OKPressed == false){
System.out.println();
}
It should work. It is connected with problem better described for example here: Threads: Busy Waiting - Empty While-Loop, and in post which duplicate it is.
Hello I am trying to create a simple game, and right now I am trying to add a couple songs to play in the background during the game, which can be stopped and skipped as the player wishes. It seems everywhere I look I can't seem to make the example code work. and the only example that does work can only play one file either in a loop or not.
public void loadmedia ()
{
song1 = getAudioClip (getCodeBase (), "song1.au");
song1.play ();
song2 = getAudioClip (getCodeBase (), "song2.au");
song2.play ();
}
song1 will play normally but song2 will do nothing, even if I tell song 1 to stop with a button and play song2.
When you need change your background song? Or after song 1 finished, song 2 start?
Sorry I can add it as a comment because my reputation < 50
This code for you to choose a couple of songs in a combobox. Give it a try. If it is not suitable for you. Give me the question again :)
Hope you like it!
import java.applet.AudioClip;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import java.net.MalformedURLException;
import java.awt.GridBagLayout;
public class SoundApplication extends JPanel
implements ActionListener,
ItemListener {
SoundList soundList;
String auFile = "spacemusic.au";
String aiffFile = "flute+hrn+mrmba.aif";
String midiFile = "trippygaia1.mid";
String rmfFile = "jungle.rmf";
String wavFile = "bottle-open.wav";
String chosenFile;
AudioClip onceClip, loopClip;
URL codeBase;
JComboBox formats;
JButton playButton, loopButton, stopButton;
JLabel status;
boolean looping = false;
public SoundApplication() {
String [] fileTypes = {auFile,
aiffFile,
midiFile,
rmfFile,
wavFile};
formats = new JComboBox(fileTypes);
formats.setSelectedIndex(0);
chosenFile = (String)formats.getSelectedItem();
formats.addItemListener(this);
playButton = new JButton("Play");
playButton.addActionListener(this);
loopButton = new JButton("Loop");
loopButton.addActionListener(this);
stopButton = new JButton("Stop");
stopButton.addActionListener(this);
stopButton.setEnabled(false);
status = new JLabel(
"Click Play or Loop to play the selected sound file.");
JPanel controlPanel = new JPanel();
controlPanel.add(formats);
controlPanel.add(playButton);
controlPanel.add(loopButton);
controlPanel.add(stopButton);
JPanel statusPanel = new JPanel();
statusPanel.add(status);
add(controlPanel);
add(statusPanel);
startLoadingSounds();
}
public void itemStateChanged(ItemEvent e){
chosenFile = (String)formats.getSelectedItem();
soundList.startLoading(chosenFile);
}
void startLoadingSounds() {
//Start asynchronous sound loading.
try {
codeBase = new URL("file:" + System.getProperty("user.dir") + "/");
} catch (MalformedURLException e) {
System.err.println(e.getMessage());
}
soundList = new SoundList(codeBase);
soundList.startLoading(auFile);
soundList.startLoading(aiffFile);
soundList.startLoading(midiFile);
soundList.startLoading(rmfFile);
soundList.startLoading(wavFile);
}
public void stop() {
onceClip.stop(); //Cut short the one-time sound.
if (looping) {
loopClip.stop(); //Stop the sound loop.
}
}
public void start() {
if (looping) {
loopClip.loop(); //Restart the sound loop.
}
}
public void actionPerformed(ActionEvent event) {
//PLAY BUTTON
Object source = event.getSource();
if (source == playButton) {
//Try to get the AudioClip.
onceClip = soundList.getClip(chosenFile);
stopButton.setEnabled(true);
onceClip.play(); //Play it once.
status.setText("Playing sound " + chosenFile + ".");
if (onceClip == null) {
status.setText("Sound " + chosenFile + " not loaded yet.");
}
return;
}
//START LOOP BUTTON
if (source == loopButton) {
loopClip = soundList.getClip(chosenFile);
looping = true;
loopClip.loop(); //Start the sound loop.
loopButton.setEnabled(false); //Disable start button.
stopButton.setEnabled(true);
status.setText("Playing sound " + chosenFile + " continuously.");
if (loopClip == null) {
status.setText("Sound " + chosenFile + " not loaded yet.");
}
return;
}
//STOP LOOP BUTTON
if (source == stopButton) {
if (looping) {
looping = false;
loopClip.stop(); //Stop the sound loop.
loopButton.setEnabled(true); //Enable start button.
} else if (onceClip != null) {
onceClip.stop();
}
stopButton.setEnabled(false);
status.setText("Stopped playing " + chosenFile + ".");
return;
}
}
public static void main(String s[]) {
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
};
JFrame f = new JFrame("SoundApplication");
f.addWindowListener(l);
f.getContentPane().add(new SoundApplication());
f.setSize(new Dimension(400,100));
f.show();
}
}
I found a working answer, thanks a lot for all those who tried to help me out, i ended up using Audio Stream and Input stream.
defining my input stream:
private AudioStream as;
method called to change songs, when the app starts, and when the next song button is pressed
public void musicconfig ()
{
try
{
if (mutestate == false)
{
AudioPlayer.player.stop (as);
InputStream in = new FileInputStream (filename [count]);
as = new AudioStream (in);
AudioPlayer.player.start (as);
}
}
catch (IOException b)
{
b.printStackTrace ();
}
count++;
if (count == 12)
{
count = 1;
}
}
setup my song list array when app first runs
public void mediaload ()
{
filename [1] = "song1.wav";
filename [2] = "song2.wav";
filename [3] = "song3.wav";
filename [4] = "song4.wav";
filename [5] = "song5.wav";
filename [6] = "song6.wav";
filename [7] = "song7.wav";
filename [8] = "song8.wav";
filename [9] = "song9.wav";
filename [10] = "song10.wav";
filename [11] = "song11.wav";
}
OK, so I had an issue where my images weren't showing when the .jar file was run.
Fixed that by using a fix from robberman I think his tag was.
Anyways once I fixed that by getting the images from getResourceAsStream etc it worked fine. So when creating the background image, a JLabel with an image, and JButtons with images as new components, this works great!
Problem I keep running into now is I have 3 buttons that need to change their icons in certain situations. I've tested this and it works without the NullPointerException in my test class, but when I try this in my projects class I get a NullPointerException each time it tries to setIcon.
Here's the method I setup to change the Icon. (I've tried this many different ways, and thought this would be easiest to see since it happens no matter what I do. ) Here's the constructor, the createGUI and the method to change the icons. Please help me out figuring what I'm doing wrong.
public class Addons {
// Setup any variables needed for this class to run
private JPanel addonsList;
private JLabel patchNotes;
private JProgressBar progressBar;
private JTable addonsTable;
private SaveSettings sav;
private Updater util;
private JButton instructions;
private JButton installButton;
private JButton finishedButton;
private boolean finishedAll;
private boolean upAvail;
private Task task;
// Setup the tables for use in the listings
/**
* Default constructor
*
*/
public Addons(Updater util) {
// Load up the saved settings.
sav = new SaveSettings();
sav.loadSave();
this.util = util;
finishedAll = false;
upAvail = false;
createAddonsGUI();
}
/**
* This method will create the gui for use in the constructor
*
*/
private void createAddonsGUI() {
// create base panel
addonsList = new JPanel();
addonsList.setPreferredSize(new Dimension(800,435));
addonsList.setOpaque(false);
SpringLayout addonsListLO = new SpringLayout();
addonsList.setLayout(addonsListLO);
// Create and place scroll frame with patch notes panel in it.
JScrollPane patchNotesPanel = createPatchNotesPanel();
patchNotesPanel.setPreferredSize(new Dimension(370,300));
addonsList.add(patchNotesPanel);
// create and place progress bar
//JLabel progressBarBackground = new JLabel(new ImageIcon(util.PROGBACK_IMAGE_PATH));
JLabel progressBarBackground = new JLabel();
try {
Image mypBarPic = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/dynastyaddons/updater/ProgressBackground.png"));
progressBarBackground = new JLabel(new ImageIcon(mypBarPic));
} catch (IOException ignore) {
System.out.println("Error: " + ignore.getMessage());
}
addonsList.add(progressBarBackground);
SpringLayout pBarLO = new SpringLayout();
progressBarBackground.setLayout(pBarLO);
progressBarBackground.setOpaque(false);
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressBarBackground.add(progressBar);
pBarLO.putConstraint(SpringLayout.WEST, progressBar, 21, SpringLayout.WEST, progressBarBackground);
pBarLO.putConstraint(SpringLayout.NORTH, progressBar, 15, SpringLayout.NORTH, progressBarBackground);
pBarLO.putConstraint(SpringLayout.EAST, progressBar, -21, SpringLayout.EAST, progressBarBackground);
pBarLO.putConstraint(SpringLayout.SOUTH, progressBar, -45, SpringLayout.SOUTH, progressBarBackground);
// Create and place Finish button
//finishedButton = new JButton(new ImageIcon(util.FINOFF_IMAGE_PATH));
//public static final String FINOFF_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\FinishedOff.png";
JButton finishedButton = new JButton();
try {
Image myfinishedButtonPic = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/dynastyaddons/updater/FinishedOff.png"));
finishedButton = new JButton(new ImageIcon(myfinishedButtonPic));
} catch (IOException ignore) {
System.out.println("Error: " + ignore.getMessage());
}
finishedButton.setBorderPainted(false);
finishedButton.setContentAreaFilled(false);
finishedButton.setFocusPainted(false);
finishedButton.setOpaque(false);
finishedButton.setToolTipText("<html><font size=6>When button glows blue, you're all done and you can press this to close the udpater.</font></html>");
finishedButton.addMouseListener(new MouseAdapter() {
#Override
public void mouseClicked(MouseEvent e) { if(finishedAll) {System.exit(0);} }
});
addonsList.add(finishedButton);
// Create and place Install Addons Button
//installButton = new JButton(new ImageIcon(util.INSTOFF_IMAGE_PATH));
//public static final String INSTOFF_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\InstallUpdatesOFF.png";
JButton installButton = new JButton();
try {
Image myinstallButtonPic = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/dynastyaddons/updater/InstallUpdatesOFF.png"));
installButton = new JButton(new ImageIcon(myinstallButtonPic));
} catch (IOException ignore) {
System.out.println("Error: " + ignore.getMessage());
}
installButton.setBorderPainted(false);
installButton.setContentAreaFilled(false);
installButton.setFocusPainted(false);
installButton.setOpaque(false);
installButton.setToolTipText("<html><center><font size=6>When arrows to the left of this button glow blue, you have updates to install.<br /> <br />Press this button to get the updated versions of your addons.</font></center></html>");
installButton.addMouseListener(new MouseAdapter() {
#Override
public void mouseClicked(MouseEvent e) {
// This will handle installing needed updates
if(upAvail) {
JFrame root = util.getRootFrame();
root.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
task = new Task();
task.execute();
root.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
});
addonsList.add(installButton);
// Create and place scroll frame with the addons list table in it.
JPanel addonListPanel = new JPanel();
addonListPanel.setPreferredSize(new Dimension(388,245));
addonsTable = new JTable(new DynastyTableModel());
JTableHeader header = addonsTable.getTableHeader();
ColumnHeaderToolTips tips = new ColumnHeaderToolTips();
header.addMouseMotionListener(tips);
addonListPanel.setLayout(new BorderLayout());
addonListPanel.add(addonsTable.getTableHeader(), BorderLayout.PAGE_START);
addonListPanel.add(new JScrollPane(addonsTable), BorderLayout.CENTER);
// setup table settings
addonsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
addonsTable.setRowSelectionAllowed(true);
addonsTable.setColumnSelectionAllowed(false);
addonsTable.setBackground(Color.BLACK);
addonsTable.setForeground(Color.WHITE);
//addonsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
addonsTable.setFillsViewportHeight(true);
addonsTable.setPreferredScrollableViewportSize(addonListPanel.getPreferredSize());
addonsTable.setRowHeight(31);
// setup column width and editing
fitToContentWidth(addonsTable, 0);
fitToContentWidth(addonsTable, 1);
fitToContentWidth(addonsTable, 2);
fitToContentWidth(addonsTable, 3);
fitToContentWidth(addonsTable, 4);
// properly align text in cells
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
addonsTable.getColumn("Version").setCellRenderer( centerRenderer );
//addonsTable.getColumn("Purchase").setCellRenderer( centerRenderer );
addonsTable.getColumn("Size").setCellRenderer( centerRenderer );
//addonsTable.getColumn("Update").setCellRenderer( centerRenderer );
addonsTable.getColumn("Name").setCellRenderer( centerRenderer );
// setup list selector
ListSelectionModel listSelectionModel = addonsTable.getSelectionModel();
listSelectionModel.addListSelectionListener(new SharedListSelectionHandler());
addonsTable.setSelectionModel(listSelectionModel);
addonListPanel.setOpaque(false);
addonsList.add(addonListPanel);
// Create and place the view instructions button.
//instructions = new JButton(new ImageIcon(util.INSTRUCTIONS_BUTTON));
//public static final String INSTRUCTIONS_BUTTON = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\instructions.png";
JButton instructions = new JButton();
try {
Image myinstructionsPic = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/dynastyaddons/updater/instructions.png"));
instructions = new JButton(new ImageIcon(myinstructionsPic));
} catch (IOException ignore) {
System.out.println("Error: " + ignore.getMessage());
}
instructions.setBorderPainted(false);
instructions.setContentAreaFilled(false);
instructions.setFocusPainted(false);
instructions.setOpaque(false);
instructions.setToolTipText("<html><center><font size=6>When this button shows purchase you can click it to go purchase the selected addon.<br /><br /> When it's showing Instructions you can click it to go see the manual for the selected addon.</font></center></html>");
// Deal with nothing selected when clciking this.
instructions.addMouseListener(new MouseAdapter() {
#Override
public void mouseClicked(MouseEvent e) {
int row = addonsTable.getSelectedRow();
String ad = "";
DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
if ( row == -1 ) { return; }
if ( row == 1 || row == 0 || row == 2 ) { ad = "Booster"; }
else {
ad = (String) tm.getValueAt(row,1);
ad = ad.replaceAll("\\s+", "");
}
boolean purchased = (Boolean) tm.getValueAt(row,3);
if (purchased) {
sendTo(ad, 1);
} else {
sendTo(ad,0);
}
}
});
addonsList.add(instructions);
// Constrain all items to the base panel
addonsListLO.putConstraint(SpringLayout.EAST, patchNotesPanel, -18, SpringLayout.EAST, addonsList);
addonsListLO.putConstraint(SpringLayout.NORTH, patchNotesPanel, 0, SpringLayout.NORTH, addonsList);
addonsListLO.putConstraint(SpringLayout.SOUTH, progressBarBackground, -20, SpringLayout.SOUTH, addonsList);
addonsListLO.putConstraint(SpringLayout.WEST, progressBarBackground, 100, SpringLayout.WEST, addonsList);
addonsListLO.putConstraint(SpringLayout.EAST, finishedButton, 0, SpringLayout.EAST, addonsList);
addonsListLO.putConstraint(SpringLayout.SOUTH, finishedButton, -20, SpringLayout.SOUTH, addonsList);
addonsListLO.putConstraint(SpringLayout.SOUTH, installButton, -10, SpringLayout.NORTH, progressBarBackground);
addonsListLO.putConstraint(SpringLayout.WEST, installButton, 190, SpringLayout.WEST, addonsList);
addonsListLO.putConstraint(SpringLayout.WEST, addonListPanel, 18, SpringLayout.WEST, addonsList);
addonsListLO.putConstraint(SpringLayout.NORTH, addonListPanel, 0, SpringLayout.NORTH, addonsList);
addonsListLO.putConstraint(SpringLayout.NORTH, instructions, -180, SpringLayout.SOUTH, addonsList);
addonsListLO.putConstraint(SpringLayout.WEST, instructions, 20, SpringLayout.WEST, addonsList);
}
/**
* This will update the table with info from the users database entry.
*
*/
public void updateTable() {
String totalIn = "";
String s = "";
String aName = "";
String aVersion = "";
String aFileSize = "";
String aInfo = "";
DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
sav.loadSave();
try {
URL serverURL = new URL(Updater.URL_CONNECT + "action=get_addons&email=" + sav.getSetting("UserName") + "&PHPSESSID=" + util.getPHPSessionID());
HttpURLConnection serverConnection = (HttpURLConnection) serverURL.openConnection();
serverConnection.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(serverConnection.getInputStream()));
while (( totalIn = in.readLine()) != null) {
s += totalIn;
}
String[] splitOne = s.split("\\|-\\|");
for ( int a = 0; a < splitOne.length; a++) {
String[] splitTwo = splitOne[a].split("\\|");
String addonName = splitTwo[0];
for ( int b = 0; b < tm.getRowCount(); b++) {
if ( addonName.equals( (String) tm.getValueAt(b,1) ) ) { // b is the correct place to place the table info into addons[][]
tm.setValueAt(splitTwo[1],b,2);
tm.setValueAt(true,b,3);
double byteSize = Double.parseDouble(splitTwo[2]);
double kbyteSize = (byteSize/1024.0);
DecimalFormat dec = new DecimalFormat("00.00");
tm.setValueAt(dec.format(kbyteSize),b,4);
pNotes[b][0] = splitTwo[3];
}
}
}
} catch (MalformedURLException e) {
JOptionPane.showMessageDialog(null, "Please send this entire error to support#dyanstyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 22", "Attention!",JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Please send this entire error to support#dynastyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 23" + e.getMessage(), "Attention!",JOptionPane.ERROR_MESSAGE);
}
checkLocalAddons();
}
/**
* This method checks the version numbers to see what what needs updating
* then updates the table to reflect this.
*
*/
private void needsUpdate() {
DynastyTableModel tm = (DynastyTableModel)addonsTable.getModel();
for ( int a = 0; a < tm.getRowCount(); a++) {
String ver = (String) tm.getValueAt(a,2).toString();
if(!ver.equals(localVersion[a][0])) {
boolean purch = (boolean) tm.getValueAt(a,3);
System.out.println("Set value at " + a + " 0 to: " + purch);
if(purch) {tm.setValueAt(true,a,0);}
}else{
tm.setValueAt(false,a,0);
}
}
checkUpdatesAvail();
}
/**
* This method will check if any of the udpate boxes are checked, and update the install button.
*
*
*/
private void checkUpdatesAvail() {
DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
boolean update = false;
for ( int a = 0; a < tm.getRowCount(); a++) {
boolean u = (Boolean) tm.getValueAt(a,0);
if (u) { update = u; }
}
if (update) {
setImageOnButton("instOn");
upAvail = true;
} else { finishedEverything(); }
}
/**
* This method handles what happens when you click the Install Updates button.
*
*/
private void updateNeededAddons() {
DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
boolean[] addUp = {false,false,false,false,false,false,false};
for (int a = 0; a < tm.getRowCount(); a++) {
boolean update = (Boolean) tm.getValueAt(a,0);
int getResult = 2;
if (update) {
addUp[a] = true;
try {
URL dlAddon = new URL(util.URL_CONNECT + "action=download&addon=" + tm.getValueAt(a,1) + "&email=" + sav.getSetting("UserName") + "&PHPSESSID=" + util.getPHPSessionID());
String fileName = tm.getValueAt(a,1) + ".zip";
String fileS = (String) tm.getValueAt(a,4);
double fileSize = Double.parseDouble(fileS);
getResult = getAddons(dlAddon, fileName, fileSize);
} catch(MalformedURLException e) {
JOptionPane.showMessageDialog(null, "We tried to create a query to download your addons, but got a malformedURLException. Please send this entire error to support#dyanstyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 31", "Attention!",JOptionPane.ERROR_MESSAGE);
}
if(getResult == 1) {
installAddon((String)tm.getValueAt(a,1));
}
}
}
}
/**
* This method will update the patch notes panel,
* it only allows updating from within this class.
*
* #param txt The new txt for the patch notes panel.
*
*/
private void setPatchNotes(String txt) {
patchNotes.setText(txt);
int prefSize = 370;
boolean width = true;
View view = (View) patchNotes.getClientProperty(javax.swing.plaf.basic.BasicHTML.propertyKey);
view.setSize(width ? prefSize : 0, width ? 0 : prefSize);
float w = view.getPreferredSpan(View.X_AXIS);
float h = view.getPreferredSpan(View.Y_AXIS);
patchNotes.setPreferredSize(new Dimension((int) Math.ceil(w) - 17, (int) Math.ceil(h) + 100));
}
/**
* This will query the server for the updates to the addons
* that are needed and download them as needed.
*
*/
private int getAddons(URL url, String localFilename, double len) {
InputStream is = null;
FileOutputStream fos = null;
try {
URLConnection urlConn = url.openConnection();
HttpURLConnection resp = (HttpURLConnection) urlConn;
int responseCode = resp.getResponseCode();
is = urlConn.getInputStream();
fos = new FileOutputStream(System.getenv("SystemDrive") + "\\DynastyAddons\\" + localFilename);
byte[] buffer = new byte[4096];
int leng = (int) len;
while ((leng = is.read(buffer)) > 0) {
fos.write(buffer,0,leng);
}
is.close();
fos.close();
return 1;
} catch (MalformedURLException e) {
JOptionPane.showMessageDialog(null, "We tried to download your addons, but got a malformedURLException. Please send this entire error to support#dyanstyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 32", "Attention!",JOptionPane.ERROR_MESSAGE);
return 2;
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "We tried to download your addons, but got an IOException. Please send this entire error to support#dynastyaddons.com. Also you can close the updater and re-open it and that sometimes removes this issue.\n Error # 33" + e, "Attention!",JOptionPane.ERROR_MESSAGE);
return 2;
}
}
/**
* This will update the finished button once all is done.
*
*/
private void finishedEverything() {
setImageOnButton("instOff");
setImageOnButton("finOn");
upAvail = false;
finishedAll = true;
}
public void setImageOnButton(String buttonName){
ImageIcon icon;
switch(buttonName) {
case "purchase": try {
System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/Purchase.png exists? " + new File("com/dynastyaddons/updater/Purchase.png").exists());
Image pic1 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/Purchase.png"));
icon = new ImageIcon(pic1);
instructions.setIcon(icon);
} catch (IOException e) { System.out.println("IO Exception setting icon to instructions: " + e.getMessage()); }
break;
case "instructions":try {
System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/instructions.png exists? " + new File("com/dynastyaddons/updater/instructions.png").exists());
Image pic2 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/instructions.png"));
icon = new ImageIcon(pic2);
instructions.setIcon(icon);
} catch (IOException e) { System.out.println("IO Exception setting icon to instructions2: " + e.getMessage()); }
break;
case "finOn": try {
System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/FinishedOn.png exists? " + new File("com/dynastyaddons/updater/FinishedOn.png").exists());
Image pic3 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/FinishedOn.png"));
icon = new ImageIcon(pic3);
finishedButton.setIcon(icon);
} catch (IOException e) { System.out.println("IO Exception setting icon to finished: " + e.getMessage()); }
break;
case "finOff": try {
System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/FinishedOff.png exists? " + new File("com/dynastyaddons/updater/FinishedOff.png").exists());
Image pic4 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/FinishedOff.png"));
icon = new ImageIcon(pic4);
finishedButton.setIcon(icon);
} catch (IOException e) { System.out.println("IO Exception setting icon to finished2: " + e.getMessage()); }
break;
case "instOn": try {
System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/InstallUpdatesON.png exists? " + new File("com/dynastyaddons/updater/InstallUpdatesON.png").exists());
Image pic5 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/InstallUpdatesON.png"));
icon = new ImageIcon(pic5);
installButton.setIcon(icon);
} catch (IOException e) { System.out.println("IO Exception setting icon to install: " + e.getMessage()); }
break;
case "instOff": try {
System.out.println("Trying to setIcon on Instructions Button. File: com/dynastyaddons/updater/InstallUpdatesOFF.png exists? " + new File("com/dynastyaddons/updater/InstallUpdatesOFF.png").exists());
Image pic6 = ImageIO.read(Addons.class.getClassLoader().getResourceAsStream("com/dynastyaddons/updater/InstallUpdatesOFF.png"));
icon = new ImageIcon(pic6);
installButton.setIcon(icon);
} catch (IOException e) { System.out.println("IO Exception setting icon to install2: " + e.getMessage()); }
break;
}
}
// This internal class will handle the modle for the table used to show the addon list.
class DynastyTableModel extends AbstractTableModel {
private String[] columnNames = {"Update",
"Name",
"Version",
"Purchase",
"Size"};
private Object[][] initialData = {
{new Boolean(false), "Booster", new Double(1.0), new Boolean(false), new Double(0)},
{new Boolean(false), "BoosterAlliance", new Double(1.0), new Boolean(false), new Double(0)},
{new Boolean(false), "BoosterHorde", new Double(1.0), new Boolean(false), new Double(0)},
{new Boolean(false), "Edge", new Double(1.0), new Boolean(false), new Double(0)},
{new Boolean(false), "Impulse", new Double(1.0), new Boolean(false), new Double(0)},
{new Boolean(false), "Tycoon", new Double(1.0), new Boolean(false), new Double(0)},
{new Boolean(false), "DynastyCore", new Double(1.0), new Boolean(false), new Double(0)},
};
public int getColumnCount() { return columnNames.length; }
public int getRowCount() { return initialData.length; }
public String getColumnName(int col) { return columnNames[col]; }
public Object getValueAt(int row, int col) { return initialData[row][col]; }
public Class getColumnClass(int c) { return getValueAt(0,c).getClass(); }
#Override
public void setValueAt(Object value, int row, int col) {
initialData[row][col] = value;
fireTableCellUpdated(row, col);
}
}
// This internal class will help handle when a row is selected in the table.
class SharedListSelectionHandler implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
if ( !e.getValueIsAdjusting() ) {
ListSelectionModel lsm = (ListSelectionModel)e.getSource();
int selected = lsm.getMinSelectionIndex();
// if purchased addon display patch notes
DynastyTableModel tm = (DynastyTableModel) addonsTable.getModel();
boolean selectedValue = (Boolean) tm.getValueAt(selected,3);
if ( selectedValue ) {
setPatchNotes(pNotes[selected][0]);
setImageOnButton("instructions");
}
else { // Otherwise update Install Instructions button to show Purchase instead.
// save currently selected addon name for use in the purchase button?
String p = "";
if (selected == 1 || selected == 2) {
p = "Booster";
} else { p = (String) tm.getValueAt(selected,1); }
setPatchNotes("<HTML>You have not purchased this addon, please go to http://dynastyaddons.com/" + p + " or click the Purchase button below the list of addons here to open the purchase page.</HTML>");
setImageOnButton("purchase");
}
}
}
}
}
As you see from the above code, the createGUI where I create the buttons using getResource() etc works fine, it's the setImagesOnButton() method at the bottom that's giving me fits.
I tried also to include the places where the method is called to make it more clear. Also the println's in the setImagesOnButton all print out that the file is found and exists, then in the next line a NullPointerException comes up saying it doesn't exist? Confusing to me.
OK, I figured out what was going on. Three things to fix this. First of all, I realized that the null problem was not the icon I was trying to put on the button, it was a misplaced JButton call at the top in the CreateGUI method. I removed that (since I had it already created in the constructor) and that went away. Second I got rid of the stupd method cause it kept confusing me. (the setImageOnButton) and finally I found that if I put the images directory in the root of the package, then called for the images using new ImageIcon(Image.read(getClass().getClassLoader().getResourceAsStream("images/imagename.png"))); I could find it since I was relating it to the package rather than the class, it worked like a charm! I compiled, jarred it up and tested on my wifes' computer and it worked perfect! Thank you all for the help, Couldn't have done it without all the great info! and to say the least, I completely understand resources and how to put them in an application and use them now. :)