我正在创建一个应用程序中心,我需要从属性文件中读取以检索应用程序名称和快捷方式,这是我检索的信息。
属性文件的格式:apps = chrome#youtube#eclipse#controlpanel
controlpanelpath = blahblah
我可以检索此信息,但我需要添加有多少应用程序的按钮。 例如,我添加了一个应用程序,然后当我重新启动应用程序时,它将显示为一个按钮。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import org.omg.CORBA.portable.InputStream;
public class appmanager {
public static String iconpath, path, name;
public static Properties prop = new Properties();
public static String result = "";
public static String filename = "apps.properties";
public static String appdata = System.getenv("APPDATA");
public static String configpath = appdata + "\\" + filename;
public static File properties = new File(configpath);
public static OutputStream output = null;
public static String apps[];
public static String raw_apps;
public static void gather() throws IOException{
output = new FileOutputStream(configpath);
raw_apps = prop.getProperty("apps");
apps=raw_apps.split(",");
//Add app path with the name in apps array
//add button to Jframe 'hud'
output.close();
}
public static void retrieve() throws IOException{
if(properties.exists()){
create();
}
else{
gather();
}
}
public static void send(){
}
public static void add(){
iconpath=appdetails.file;
path=MainGui.file;
}
public static void create() throws IOException{
System.out.println(configpath);
output = new FileOutputStream(configpath);
output.close();
}
}
主应用中心jframe在另一个类中,它被称为“hud”。
BTW我只需要添加按钮的部分应用数量!感谢
答案 0 :(得分:3)
面向对象的方法:
以下方法使用JSON配置文件。使用Google的GSON库解析文件,配置文件中的信息是应用程序用来构建按钮的信息。
已经过测试和验证。您可能需要删除或更改应用程序的应用程序路径才能正常运行。
注意:您需要一个依赖关系管理系统,即Maven或Gradle来拉入GSON,或者您可以下载一个jar并手动链接它。
这是应用程序的骨架结构。
> AppLauncher/
> src/
> app/
> component/
- AppButton.java
> config/
> dto/
- AppConfig.java
- RootConfig.java
> view/
- AppDashboard.java
> resources/
- appConfig.json
- AppLauncher.java
这是应用程序启动程序,它在读取配置文件后启动应用程序。
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import app.config.dto.RootConfig;
import app.config.reader.ConfigReader;
import app.view.AppDashboard;
public class AppLauncher {
public static final String APP_TITLE = "App Launcher";
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame(APP_TITLE);
RootConfig config = ConfigReader.read("/resources/appConfig.json");
AppDashboard dashboard = new AppDashboard(config);
System.out.println(config);
frame.setContentPane(dashboard);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
此视图包含配置中定义的每个应用程序的按钮。
package app.view;
import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import app.component.AppButton;
import app.config.dto.AppConfig;
import app.config.dto.RootConfig;
public class AppDashboard extends JPanel {
private static final long serialVersionUID = -3885872923055669204L;
private RootConfig config;
private List<AppButton> buttons;
public AppDashboard(RootConfig config) {
super(new FlowLayout());
this.config = config;
buttons = new ArrayList<AppButton>();
for (AppConfig appConfig : config.getApplications()) {
buttons.add(new AppButton(appConfig));
}
createChildren();
}
protected void createChildren() {
for (AppButton button : buttons) {
this.add(button);
}
}
}
这是应用程序按钮,当按钮被触发时,该按钮具有文本标签和启动操作。这可以扩展为呈现应用程序的图标。
package app.component;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import app.config.dto.AppConfig;
public class AppButton extends JButton {
private static final long serialVersionUID = -730609116042003884L;
private AppConfig config;
public AppButton(AppConfig config) {
super();
this.config = config;
setAction(new AbstractAction(config.getName()) {
private static final long serialVersionUID = -2999563123610952893L;
@Override
public void actionPerformed(ActionEvent e) {
try {
launch();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
}
private String[] procArguments() {
List<String> commands = config.getArguments();
commands.add(0, config.getPath());
return commands.toArray(new String[commands.size()]);
}
/**
* @see http://stackoverflow.com/questions/13991007/execute-external-program-in-java
*/
public void launch() throws IOException {
String[] args = procArguments();
Process process = new ProcessBuilder(args).start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:", Arrays.toString(args));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
它处理读取JSON配置文件并将其编组到java DTO(数据传输对象)中,该文件将由应用程序的组件使用。
package app.config.reader;
import java.io.InputStreamReader;
import com.google.gson.Gson;
import app.config.dto.RootConfig;
public class ConfigReader {
private static ClassLoader loader = ConfigReader.class.getClassLoader();
public static RootConfig read(String filename) {
return new Gson().fromJson(getInputStream(filename), RootConfig.class);
}
private static InputStreamReader getInputStream(String filename) {
return new InputStreamReader(loader.getResourceAsStream(filename));
}
}
这是包含应用程序配置的配置的根目录。
package app.config.dto;
import java.util.List;
public class RootConfig {
private List<AppConfig> applications;
public List<AppConfig> getApplications() {
return applications;
}
public void setApplications(List<AppConfig> applications) {
this.applications = applications;
}
@Override
public String toString() {
return "RootConfig [applications=" + applications + "]";
}
}
这是描述应用程序的应用程序配置。
package app.config.dto;
import java.util.List;
public class AppConfig {
private String name;
private String path;
private List<String> arguments;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public List<String> getArguments() {
return arguments;
}
public void setArguments(List<String> arguments) {
this.arguments = arguments;
}
@Override
public String toString() {
return "AppConfig [name=" + name + ", path=" + path + ", arguments=" + arguments + "]";
}
}
这是配置文件,应用程序将读取该文件来创建按钮。
{
"applications" : [
{
"name" : "Chrome",
"path" : "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe",
"arguments" : []
}, {
"name" : "Eclipse",
"path" : "C:/Eclipse/current/eclipse.exe",
"arguments" : []
}, {
"name" : "Control Panel",
"path" : "C:/Windows/System32/control.exe",
"arguments" : []
}
]
}
这些是程序解析JSON文件所需的Maven依赖项。您可以使用另一个解析库,例如Jackson或JsonLib。
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.4</version>
</dependency>
</dependencies>