Java: Installer für Mods programmieren

JavaGamer

Bekanntes Mitglied
Hi,

ich bin momentan dabei einen Installer in Java zu programmieren, allerdings komme ich jetzt gerade nicht mehr weiter.
Bisher habe ich schon dies programmiert (Ich verwende übrigens Java 8):

Java:
import java.io.File;
import java.util.Locale;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

public class Installer 
{
	
	private static JFrame frame;
	public static JProgressBar progressBar;
	
	public static void main(String[] args)
	{
		frame = new JFrame("ModPack - Installer");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(400, 300);
		frame.setLocationRelativeTo(null);
		frame.setLayout(null);
		
		progressBar = new JProgressBar(0, 100);
		progressBar.setBounds(40, 60, 300, 30);
		progressBar.setValue(0);
		
		frame.add(progressBar);
		frame.setVisible(true);
		
		Task task = new Task();
		task.execute();
	}
	
	private static File getPath()
	{
		String userHomeDir = System.getProperty("user.home", ".");
		String osType = System.getProperty("os.name").toLowerCase(Locale.ENGLISH);
		File targetDir = null;
		String mcDir = ".minecraft\\mods";
		
		if(osType.contains("win") && System.getenv("APPDATA") != null)
			targetDir = new File(System.getenv("APPDATA"), mcDir);
		else if(osType.contains("mac"))
			targetDir = new File(new File(new File(userHomeDir, "Library"),"Application Support"),"minecraft");
		else
			targetDir = new File(userHomeDir, mcDir);
		
		if(!targetDir.exists() || !targetDir.isDirectory() || !targetDir.canWrite())
			targetDir.mkdir();
		
		return targetDir;
	}
	
	class Task extends SwingWorker<Void, Void>
	{
		
		@Override
		public Void doInBackground()
		{
			setProgress(0);
			
			// Copy Files
			
			
			return null;
		}
		
		@Override
		public void done()
		{
			System.exit(0);
		}
	}
}

Nun stehe ich aber vor dem Problem, dass ich bei
Java:
Task task = new Task();
ein Fehler erhalte und zudem weiß ich auch nicht wie ich dass jetzt mit der ProgressBar hinbekomme und wie ich die Dateien, die ich gerne in die .jar hineinpacken möchte von A nach B kopiere (also aus der Installer.jar raus in den Mods-Folder von Minecraft der erstellt werden soll wenn dieser nicht vorhanden ist).
Zudem wäre vielleicht eine Anzeige mit der Zeit die noch verbleicht und wie viel GB/MB schon rüberkopiert worden sind von der gesammten Dateigröße aller Dateien hilfreich.

Ich hoffe ihr könnt mir hierbei helfen und hoffentlich schaffe ich es diesmal. (ich hatte im Laufe der Zeit schon mehrmals die selbe Frage, bin bisher immer am selben Punkt gescheitert: SwingWorkers ... nun ja, die SwingWorkers sind auch der Grund warum ich momentan C++ lerne, nur leider bin ich noch nicht soweit um den Installer in C++ zu programmieren [Witzigerweise sind die SwingWorker der einzige Grund warum ich C++ lerne xD, hoffe ja mal dass es in C++ leichter sein wird])

JavaGamer
 
Zuletzt bearbeitet von einem Moderator:
Hey,

also die Aussage "Ich bekomme einen Fehler" hilft uns nicht wirklich weiter.
Wieso willst du denn eigentlich Task verwenden ? Dafür gibt es den Thread.
Wenn du das mit der Progressbar nicht hinbekommst wird es wohl auch an den grundlegenden Java-Basics fehlen.
Da hilft dann blos in die docs schauen oder mal jemanden fragen der da weiter weiß.
Wenn du Eclipse benutz kann ich dir weiterhelfen, das ding fertig zu bekommen.
Musst mich blos per PN anschreiben.

mfg Major
 
Wiso ich dies verwenden will, ganz einfach, alles was ich zum Thema ProgressBar im Internet gefunden habe und jedes mal wo ich hier mal einen Thread erstellt hatte zum Thema ProgressBar ist darauf hinausgelaufen dass ich SwingWorker verwenden sollte und Task ist nur der Name der Klasse.
Nun ja, sagen wir es mal so, an Java Basics kenne ich mich besser mit dem Graphics lib aus als mit Swing und AWT...
Zudem kenne ich mich mit SwingWorkern auch nicht so wirklich aus, ich habe mir mal dazu einiges angeschaut aber wenn ich dann was anderes machen will als das was beschrieben wurde komme ich mit SwingWorkern net weiter...
Nun ja, mit den JavaDocs komme ich auch net so wirklich klar.... für mich sind die einfach zu unübersichtlich und bieten zu wenig Infos...
Und ja ich verwende Eclipse 😉
 
Na also, wieso schreibste nicht einfach deine eigene Progress-bar ?
Erstelle nen BufferedImage, dann die pixel davon getten und dann kannst das ding verändern wie du willst.
Dann einfach die paint von deinem Frame/Panel oder was auch immer überschreiben und das Bild malen.
fertig 😀

mfg Major
 
Wiso sollte ich mir meine eigene Progress-bar schreiben. Dann stehe ich doch wieder vor dem selben Problem, was ich inzwischen entlich gelöst habe.
Problem jetzt ist halt, dass der Download stoppt und ich weiß immer noch nicht wie ich die verbleibene Zeit anzeige:

Java:
	public void runCalc()
	{
		progressBar.setIndeterminate(true);
		
		FileDownload download = null;
		try 
		{
			download = new FileDownload(new URL("http://download1891.mediafire.com/88mmpd75axkg/ry715imp6810kd6/Primeval+Forest+%28MC+1.6.4%29.zip"));

		} 
		catch (MalformedURLException e)
		{
			e.printStackTrace();
		}
		
		if(download != null)
		{
			download.addPropertyChangeListener(new PropertyChangeListener()
			{
				@Override
				public void propertyChange(PropertyChangeEvent evt) 
				{
					if("progress".equals(evt.getPropertyName()))
					{
						progressBar.setIndeterminate(false);
						progressBar.setValue((Integer) evt.getNewValue());
					}
				}
			});
			download.execute();
		}
	}

Java:
public class FileDownload extends SwingWorker<Double, Double>
{
	
	private BufferedInputStream in = null;
	private FileOutputStream fout = null;
	private BufferedOutputStream bout = null;
	private URLConnection connection = null;
	
	private URL url;
	private String file_name;
	
	private int minValue = 0, maxValue = 0;
	
	public FileDownload(URL url) 
	{
		this.url = url;
	}
	
	@Override
	protected Double doInBackground() throws Exception
	{
		try
		{
			connection = (URLConnection) url.openConnection();
			maxValue = connection.getContentLength();
			
			Logger.log(Level.DEBUG, getPath().getAbsolutePath());
			Logger.log(Level.DEBUG, url.getFile());
			
			file_name = FileNameUtils.getName(url);
			System.out.println(file_name);
			
			in = new BufferedInputStream(connection.getInputStream());
			fout = new FileOutputStream(getPath() + file_name);
			bout = new BufferedOutputStream(fout, 1024);
			
			final byte data[] = new byte[1024];
			int cout;
			
			while((cout = in.read(data, 0, 1024)) != -1)
			{
				fout.write(data, 0, cout);
				minValue = minValue + in.read();
				
				setProgress((minValue * 100) / maxValue);
				publish(Double.valueOf((minValue * 100) / maxValue));
				System.out.println("min: " + minValue);
				System.out.println("max: " + maxValue);
			}
			
			in.close();
			fout.close();
			bout.close();
		}
		catch (MalformedURLException e)
		{
			e.printStackTrace();
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
		
		return Double.valueOf((minValue * 100) / maxValue);
	}
	
	@Override
	protected void process(List<Double> chunks)
	{
		Installer.label.setText("" + file_name);
	}
	
	private static File getPath()
	{
		String userHomeDir = System.getProperty("user.home", ".");
		String osType = System.getProperty("os.name").toLowerCase(Locale.ENGLISH);
		File targetDir = null;
		String mcDir = ".minecraft\\mods\\";
		
		if(osType.contains("win") && System.getenv("APPDATA") != null)
			targetDir = new File(System.getenv("APPDATA"), mcDir);
		else if(osType.contains("mac"))
			targetDir = new File(new File(new File(userHomeDir, "Library"),"Application Support"),"minecraft\\mods\\");
		else
			targetDir = new File(userHomeDir, mcDir);
		
		if(!targetDir.exists() || !targetDir.isDirectory() || !targetDir.canWrite())
			targetDir.mkdirs();
		
		return targetDir;
	}
}

Hierbei besteht nun das Problem, dass der Download einfach bei 13% stehen bleibt. Schaue ich dann im Ordner nach, steht das die .zip Datei 199kb groß ist, also so groß wie sie sein sollte, nur öffnen kann man diese auch nicht.
Zudem wird die Datei im .minecraft Ordner erstellt und heißt dann einfach modsXXX. Dabei sollte die Datei eigentlich im mods Ordner liegen und den Namen XXX haben (XXX ist ein Platzhalter).

Dann habe ich nur mal den Output von Eclipse:
Code:
Primeval Forest (MC 1.6.4).zip
min: 0
max: 204226
min: 228
max: 204226
min: 361
max: 204226
min: 604
max: 204226
min: 833
max: 204226
min: 977
max: 204226
min: 1195
max: 204226
min: 1300
max: 204226
min: 1546
max: 204226
min: 1547
max: 204226
min: 1769
max: 204226
min: 1911
max: 204226
min: 1911
max: 204226
min: 2084
max: 204226
min: 2339
max: 204226
min: 2376
max: 204226
min: 2499
max: 204226
min: 2605
max: 204226
min: 2803
max: 204226
min: 2966
max: 204226
min: 3171
max: 204226
min: 3411
max: 204226
min: 3487
max: 204226
min: 3532
max: 204226
min: 3740
max: 204226
min: 3856
max: 204226
min: 3966
max: 204226
min: 4125
max: 204226
min: 4132
max: 204226
min: 4380
max: 204226
min: 4593
max: 204226
min: 4691
max: 204226
min: 4854
max: 204226
min: 4978
max: 204226
min: 4999
max: 204226
min: 5029
max: 204226
min: 5245
max: 204226
min: 5323
max: 204226
min: 5323
max: 204226
min: 5323
max: 204226
min: 5323
max: 204226
min: 5323
max: 204226
min: 5464
max: 204226
min: 5525
max: 204226
min: 5639
max: 204226
min: 5660
max: 204226
min: 5733
max: 204226
min: 5896
max: 204226
min: 6079
max: 204226
min: 6298
max: 204226
min: 6314
max: 204226
min: 6418
max: 204226
min: 6569
max: 204226
min: 6653
max: 204226
min: 6856
max: 204226
min: 7059
max: 204226
min: 7163
max: 204226
min: 7275
max: 204226
min: 7410
max: 204226
min: 7487
max: 204226
min: 7684
max: 204226
min: 7908
max: 204226
min: 8055
max: 204226
min: 8151
max: 204226
min: 8245
max: 204226
min: 8291
max: 204226
min: 8516
max: 204226
min: 8544
max: 204226
min: 8764
max: 204226
min: 8864
max: 204226
min: 8978
max: 204226
min: 9005
max: 204226
min: 9074
max: 204226
min: 9142
max: 204226
min: 9342
max: 204226
min: 9507
max: 204226
min: 9598
max: 204226
min: 9706
max: 204226
min: 9873
max: 204226
min: 9970
max: 204226
min: 10020
max: 204226
min: 10257
max: 204226
min: 10401
max: 204226
min: 10472
max: 204226
min: 10627
max: 204226
min: 10804
max: 204226
min: 10906
max: 204226
min: 10960
max: 204226
min: 11148
max: 204226
min: 11258
max: 204226
min: 11476
max: 204226
min: 11606
max: 204226
min: 11742
max: 204226
min: 11948
max: 204226
min: 11955
max: 204226
min: 12125
max: 204226
min: 12232
max: 204226
min: 12423
max: 204226
min: 12612
max: 204226
min: 12837
max: 204226
min: 12976
max: 204226
min: 13052
max: 204226
min: 13136
max: 204226
min: 13361
max: 204226
min: 13463
max: 204226
min: 13542
max: 204226
min: 13696
max: 204226
min: 13837
max: 204226
min: 13969
max: 204226
min: 14046
max: 204226
min: 14112
max: 204226
min: 14238
max: 204226
min: 14446
max: 204226
min: 14603
max: 204226
min: 14815
max: 204226
min: 15050
max: 204226
min: 15175
max: 204226
min: 15330
max: 204226
min: 15548
max: 204226
min: 15617
max: 204226
min: 15835
max: 204226
min: 15836
max: 204226
min: 16082
max: 204226
min: 16186
max: 204226
min: 16284
max: 204226
min: 16377
max: 204226
min: 16387
max: 204226
min: 16497
max: 204226
min: 16603
max: 204226
min: 16819
max: 204226
min: 17052
max: 204226
min: 17287
max: 204226
min: 17401
max: 204226
min: 17481
max: 204226
min: 17693
max: 204226
min: 17836
max: 204226
min: 17993
max: 204226
min: 18212
max: 204226
min: 18433
max: 204226
min: 18536
max: 204226
min: 18732
max: 204226
min: 18913
max: 204226
min: 19039
max: 204226
min: 19206
max: 204226
min: 19263
max: 204226
min: 19503
max: 204226
min: 19689
max: 204226
min: 19724
max: 204226
min: 19944
max: 204226
min: 20094
max: 204226
min: 20191
max: 204226
min: 20308
max: 204226
min: 20397
max: 204226
min: 20506
max: 204226
min: 20692
max: 204226
min: 20900
max: 204226
min: 20932
max: 204226
min: 21146
max: 204226
min: 21272
max: 204226
min: 21527
max: 204226
min: 21539
max: 204226
min: 21693
max: 204226
min: 21921
max: 204226
min: 22165
max: 204226
min: 22251
max: 204226
min: 22268
max: 204226
min: 22432
max: 204226
min: 22615
max: 204226
min: 22746
max: 204226
min: 22866
max: 204226
min: 23024
max: 204226
min: 23201
max: 204226
min: 23206
max: 204226
min: 23275
max: 204226
min: 23409
max: 204226
min: 23639
max: 204226
min: 23796
max: 204226
min: 23958
max: 204226
min: 24063
max: 204226
min: 24215
max: 204226
min: 24386
max: 204226
min: 24491
max: 204226
min: 24531
max: 204226
min: 24690
max: 204226
min: 24731
max: 204226
min: 24794
max: 204226
min: 24995
max: 204226
min: 25168
max: 204226
min: 25423
max: 204226
min: 25614
max: 204226
min: 25614
max: 204226
min: 25780
max: 204226
min: 25896
max: 204226
min: 25896
max: 204226
min: 25907
max: 204226
min: 25909
max: 204226
min: 25909
max: 204226
min: 25909
max: 204226
min: 25917
max: 204226
min: 26022
max: 204226
min: 26136
max: 204226
min: 26343
max: 204226
min: 26459
max: 204226
min: 26568
max: 204226
min: 26678
max: 204226
min: 26678
max: 204226
min: 26795
max: 204226
min: 26794
max: 204226

Irgendeine Idee, wie ich den Dateinamen und die Location der Datei beheben kann und wie ich vorallem den Download fertigstellen kann.
Dann würde ich noch gerne wissen wie ich die verbleibene Zeit anzeigen kann.

Ich hoffe ihr könnt mir hierbei helfen. 😉
JavaGamer
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben