Ste*_*ess 8 java user-interface swing
直接解决我的问题.
你如何做大规模的GUI项目.到目前为止,我还没有在java中做过任何更大的GUI项目,但我现在正在进行的工作变得非常快,而且相当大,现在我被困在一大堆非常烦人和混乱的代码中.
由于我来自Web开发领域,我习惯于MVC框架所以我在我的项目模型中有3个包我保留了与whit文件或db交互的类,其中我保留了我的类用于Forms或GUI和Controller包的地方我的大多数逻辑.
我被告知要将我的逻辑分开,同时在一个班级和另一个班级的听众中保持行动,但我不知道如何将所有这些联系起来.
到目前为止,我只有一个Controller类,我执行所有关于GUI调用后发生的所有方法.
package pft.controller;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JTree;
import java.awt.event.*;
import javax.swing.JProgressBar;
import pft.view.Invoke_GUI;
import pft.model.Events;
import pft.model.Parse;
public class Tower_Controller {
public Tower_Controller() {
}
//Global variables
String isSelected = null;
int hasModules = 0;
int cap = 0;
int cpu = 0;
int shield = 0;
int armor = 0;
public void setName(String name){
this.isSelected = name;
}
public String getName(){
return this.isSelected;
}
public void setCap(int cap){
this.cap = cap;
}
public int getCap(){
return this.cap;
}
public void setCpu(int cpu){
this.cpu = cpu;
}
public int getCpu(){
return this.cpu;
}
public void setShield(int shield){
this.shield = shield;
}
public int getShield(){
return this.shield;
}
public void setArmor(int armor){
this.armor = armor;
}
public int getArmor(){
return this.armor;
}
public void invoke() throws IOException {
Invoke_GUI runnable = new Invoke_GUI();
final JLabel tower_name = runnable.tower_name;
final JComboBox tower_select = runnable.tower_select;
final JTree module_browser = runnable.module_browser;
final JTree selected_modules = runnable.selected_modules;
final JProgressBar cap_bar = runnable.cap_bar;
final JProgressBar cpu_bar = runnable.cpu_bar;
final JLabel em_res = runnable.em;
final JLabel th_res = runnable.thermic;
final JLabel ki_res = runnable.kinetic;
final JLabel ex_res = runnable.explosive;
setTowerName(tower_name, tower_select);
removeTower(tower_name);
runnable.setVisible(true);
}
public void removeTower(final JLabel tower_name) {
tower_name.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
if (hasModules == 1 & isSelected != null) {
Events evt = new Events();
evt.towerHasModules();
} else if (isSelected == null) {
} else {
tower_name.setText("No Control Tower selected");
isSelected = null;
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
public void updateVariables(String name) throws IOException{
Parse tower = new Parse();
String data[] = tower.towerData(name);
Integer x = Integer.valueOf(data[1]).intValue();
setCap(x);
}
public void setTowerName(final JLabel tower_name, final JComboBox tower_select) {
tower_select.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (isSelected != null) {
Events evt = new Events();
evt.towerSelected(isSelected);
} else {
tower_name.setText(tower_select.getSelectedItem().toString());
setName(tower_name.toString());
try {
updateVariables(tower_name.toString());
} catch (IOException ex) {
Logger.getLogger(Tower_Controller.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
有很多教程和示例如何执行小型通常单类Java GUI,但没有关于如何进行比单个类大的项目的教程或示例.
在此先感谢所有的帮助和建议.
以下是我对Swing开发的一般建议.它确实讨论了使用控制器来桥接视图需求和模型内容的重要性.
在我做的Last Swing项目中,我设计了一个MVC框架,它使用Spring来定义程序和控制器的模型,然后在Controller中使用注释将视图调度的事件连接到控制器中的方法.该视图可以访问事件调度程序,它是一个事件总线,通过总线发送的事件通过注释在Controller上调用方法.这允许任何Controller响应View中的事件.因此,当控制器太大时,将每组方法重构为另一个控制器非常简单,并且视图或模型不必更改.
事件总线的优点在于它可以与模型共享,因此模型可以调度Controller也可以注册的异步事件.它看起来像:
public class SomeController {
private AuthenticationModel authenticationModel;
private LoginService loginService;
private MyApp view;
@Listener( event = "login" )
public void login( LoginEvent event ) {
view.showWaitDialog();
loginService.login( event.getUserName(), event.getPassword() )
.onResult( new Callback<User>() {
public void onResult( User user ) {
authenticationModel.setUser( user );
view.hideWaitDialog();
view.showStartScreen(user);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
一旦这个框架到位,令人惊讶的是我们能够以多快的速度完成任务.当我们添加功能时,它的表现相当不错.我已经完成了大量Swing项目(迄今为止3个),这个架构产生了巨大的变化.
| 归档时间: |
|
| 查看次数: |
4144 次 |
| 最近记录: |