- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是一个很长的类,下面是我的“主要”类,它包含我的大部分 UI 逻辑及其所有监听器等。无论如何你可以看到我在一个类和整个类中插入了很多代码只是看起来不可读,但它确实有效。
我在一个单独的包中有一个单独的 GUI 类,我在我的 initUI() 函数中调用该类,然后从这里我引用所有组件并编写将这些组件作为参数获取并添加特定的方法这些组件的听众。我还通过方法 setter/getter 引用了每个 GLOBAL 变量,而不是直接引用它们。如您所见,函数列表堆积在 initUI() 中,而我还没有完成一半。
I am guessing this is not even near professional approach, could you please provide me whit newbie tip, examples and suggestions how to improve all this code because even tho all this is working as it should it is very very ugly to look at and there are no books or tutorials that explain how approach coding a larger application.
Also even tho i am mid way done whit this GUI i like to experiment and i have been told that JavaFX is much better for doing Java GUI and that code you get is much more pleasing that what you would get as in Java Swing but on the other hand there is a lot of down vote for JavaFX regarding that its not really fully ready for use.
无论如何,这是我的代码:
package ept.controller;
import ept.view.EPTMain;
import ept.model.EPTEvent_Model;
import ept.model.EPTLocal_Model;
import ept.model.EPTModule_Model;
import java.awt.Font;
import java.awt.MouseInfo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
public class EPTIndex_Controler {
public EPTIndex_Controler() {
initUI();
}
//Globals
protected String selectedTower = null;
protected Integer selectedModules = 0;
public void setSelectedTower(String tower){
this.selectedTower = tower;
}
public String getSelectedTower(){
return this.selectedTower;
}
public void setSelectedModules(Integer i){
this.selectedModules += i;
}
public void decrementSelectedModule(Integer i){
this.selectedModules -= 1;
}
public Integer getSelectedModules(){
return this.selectedModules;
}
private void initUI(){
EPTMain runnable = new EPTMain();
JLabel towerName = runnable.tower_name;
JComboBox towerSelect = runnable.tower_selection;
JLabel shield_ = runnable.shield_amount;
JLabel armor_ = runnable.armor_amount;
JLabel em_ = runnable.em_amount;
JLabel th_ = runnable.th_amount;
JLabel kn_ = runnable.kn_amount;
JLabel ex_ = runnable.ex_amount;
JProgressBar cpu_bar = runnable.cpu_bar;
JProgressBar cap_bar = runnable.capacitor_bar;
JList mod_browse = runnable.module_browser;
JList mod_select = runnable.selected_modules;
Font decode = new Font("monospaced", Font.PLAIN, 12);
mod_select.setFont(decode);
//mod_browse.setFont(decode);
setTowerName(towerName, towerSelect, shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar);
removeTower(towerName, shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar);
addModule(mod_browse, mod_select, shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar);
removeModule(mod_select, shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar);
runnable.setExtendedState(EPTMain.MAXIMIZED_BOTH);
runnable.setVisible(true);
}
protected DefaultListModel struct = new DefaultListModel();
private void removeModule(final JList select, final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_,
final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){
select.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
String removable = select.getSelectedValue().toString();
if(e.getClickCount() == 2 && removable.equals("No modules have been selected") == false){
String cap = select.getSelectedValue().toString().substring(61, 70).trim();
String cpu = select.getSelectedValue().toString().substring(75).trim();
Integer D_CAP = Integer.valueOf(cap).intValue();
Integer D_CPU = Integer.valueOf(cpu).intValue();
decConsumedCap(D_CAP);
decConsumedCpu(D_CPU);
struct.removeElement(select.getSelectedValue());
incrementVariables(shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar);
select.setModel(struct);
decrementSelectedModule(1);
}
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
});
}
private void addModule(final JList browse, final JList select, final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_,
final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){
browse.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
String addable = browse.getSelectedValue().toString();
if(e.getClickCount() == 2 && getSelectedTower() != null && addable.charAt(0) == ' '){
String data[] = new EPTModule_Model().moduleData(addable.trim());
String module = data[0];
Integer capacitor = Integer.valueOf(data[1]).intValue(); setConsumedCap(capacitor);
Integer cpu = Integer.valueOf(data[2]).intValue(); setConsumedCpu(cpu);
String module_cap = data[1];
String module_cpu = data[2];
if(getConsumedCap()+capacitor > getCap() || getConsumedCpu()+cpu > getCpu()){
new EPTEvent_Model().eventNoCapOrCpu();
} else {
struct.addElement(String.format("> %-47s Capacitor: %-8s CPU: %s", module, module_cap, module_cpu));
select.setModel(struct);
setSelectedModules(1);
incrementVariables(shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar);
}
} else if (e.getClickCount() == 2 && getSelectedTower() == null){
new EPTEvent_Model().eventNoTowerSelected();
}
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
});
}
private void removeTower(final JLabel type, final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_,
final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){
type.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
if(getSelectedModules() == 0){
type.setText("No Control Tower Selected");
setSelectedTower(null);
resetVariables(shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar);
} else {
new EPTEvent_Model().eventModuleSelected();
}
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
});
}
private void setTowerName(final JLabel type, final JComboBox type2, final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_,
final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){
type2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if(getSelectedTower() != null){
new EPTEvent_Model().eventTowerSelected();
} else {
setSelectedTower(type2.getSelectedItem().toString());
new EPTDispatch_Controler(type, type2.getSelectedItem().toString());
updateVariables(shield_, armor_, em_, th_, kn_, ex_, cap_bar, cpu_bar);
}
}
});
}
//Referenced Globals
protected int cap = 0;
protected int consumed_cap = 0;
protected int cpu = 0;
protected int consumed_cpu = 0;
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 resetConsumed(){
this.consumed_cap = 0;
this.consumed_cpu = 0;
}
public void setConsumedCap(int consumed_cap){
this.consumed_cap += consumed_cap;
}
public void decConsumedCap(int consumed_cap){
this.consumed_cap -= consumed_cap;
}
public int getConsumedCap(){
return this.consumed_cap;
}
public void setConsumedCpu(int consumed_cpu){
this.consumed_cpu += consumed_cpu;
}
public void decConsumedCpu(int consumed_cpu){
this.consumed_cpu -= consumed_cpu;
}
public int getConsumedCpu(){
return this.consumed_cpu;
}
//Referenced Globals
protected int shield = 0;
protected int armor = 0;
protected double em = 00.00;
protected double th = 00.00;
protected double kn = 00.00;
protected double ex = 00.00;
public void setEm(double em){
this.em = em;
}
public double getEm(){
return this.em;
}
public void setTh(double th){
this.th = th;
}
public double getTh(){
return this.th;
}
public void setKn(double kn){
this.kn = kn;
}
public double getKn(){
return this.kn;
}
public void setEx(double ex){
this.ex = ex;
}
public double getEx(){
return this.ex;
}
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;
}
private void setCL(JProgressBar t, int i){
t.setValue(i);
}
private void incrementVariables(final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_,
final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){
cap_bar.setMaximum(getCap());
cap_bar.setValue(getConsumedCap());
cap_bar.setString(getConsumedCap() + " / " + getCap());
cap_bar.setStringPainted(true);
cpu_bar.setMaximum(getCpu());
cpu_bar.setString(getConsumedCpu() + " / " + getCpu());
cpu_bar.setStringPainted(true);
cap_bar.setValue(getConsumedCpu());
String shieldA = String.valueOf(getShield()).toString();
shield_.setText(shieldA);
String armorA = String.valueOf(getArmor()).toString();
armor_.setText(armorA);
double e = getEm();
String emT = String.valueOf(e);
em_.setText(emT);
double t = getTh();
String thT = String.valueOf(t);
th_.setText(thT);
double k = getKn();
String knT = String.valueOf(k);
kn_.setText(knT);
double x = getEx();
String exT = String.valueOf(x);
ex_.setText(exT);
}
private void updateVariables(final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_,
final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){
String data[] = new EPTLocal_Model().serializeData(getSelectedTower());
Integer capA = Integer.valueOf(data[1]).intValue();
setCap(capA);
cap_bar.setMaximum(getCap());
cap_bar.setString(getConsumedCap() + " / " + getCap());
cap_bar.setValue(getConsumedCap());
cap_bar.setStringPainted(true);
Integer cpuA = Integer.valueOf(data[2]).intValue();
setCpu(cpuA);
cpu_bar.setMaximum(getCpu());
cpu_bar.setString(getConsumedCpu() + " / " + getCpu());
cpu_bar.setValue(getConsumedCpu());
cpu_bar.setStringPainted(true);
Integer shieldAmount = Integer.valueOf(data[3]).intValue();
setShield(shieldAmount);
shield_.setText(data[3]);
Integer armorAmount = Integer.valueOf(data[4]).intValue();
setArmor(armorAmount);
armor_.setText(data[4]);
Double emT = Double.valueOf(data[5]).doubleValue();
setEm(emT);
em_.setText(data[5]);
Double thT = Double.valueOf(data[6]).doubleValue();
setTh(thT);
th_.setText(data[6]);
Double knT = Double.valueOf(data[7]).doubleValue();
setKn(knT);
kn_.setText(data[7]);
Double exT = Double.valueOf(data[8]).doubleValue();
setEx(exT);
ex_.setText(data[8]);
}
private void resetVariables(final JLabel shield_, final JLabel armor_, final JLabel em_, final JLabel th_,
final JLabel kn_, final JLabel ex_, final JProgressBar cap_bar, final JProgressBar cpu_bar){
resetConsumed();
setCap(0);
cap_bar.setMaximum(getCap());
cap_bar.setString(getConsumedCap() + " / " + getCap());
cap_bar.setStringPainted(true);
setCpu(0);
cpu_bar.setMaximum(getCpu());
cpu_bar.setString(getConsumedCpu() + " / " + getCpu());
cpu_bar.setStringPainted(true);
setShield(0);
shield_.setText("0");
setArmor(0);
armor_.setText("0");
setEm(00.00);
em_.setText("00.00");
setTh(00.00);
th_.setText("00.00");
setKn(00.00);
kn_.setText("00.00");
setEx(00.00);
ex_.setText("00.00");
}
}
最佳答案
首先要做的是.. 永远不要使用 Netbeans GUI 来拖放您的组件。这很容易,但以后会导致很多问题。如果您调整窗口大小,您的所有组件都不会正确调整大小,如果您想稍后动态添加组件,您将受到影响。而是使用一个好的布局管理器。 jdk自带的不好用,试试这个: http://www.jgoodies.com/freeware/forms/
接下来,如果您要制作一个巨大的框架,最好将它分成多个面板。每个面板在一个单独的类中。这将使您能够轻松地管理小型 GUI。不要在代码中乱放匿名内部类。相反,让该类实现一个监听器并在 actionPerformed() 方法中使用 if block 来处理您的操作。使您的代码更具可读性。否则使用 Actions 并传递它们。
在另一个线程上执行所有长时间运行的操作,例如访问数据库或读取/写入文件。否则您的 GUI 将卡住。使用 Swing Worker - http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html这会在一定程度上迫使你以MVC方式思考。之后由你来分开你的类(class),这样 M、V 和 C 都是分开的。
关于Java如何: proper GUI coding?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8643386/
我一直在使用 Tensorflow 解决线性回归问题。我得到一条平坦的曲线 pred_y。我应该如何将我的曲线与观察的训练示例拟合? 这是我的 tensorflow 代码: # coding: utf
我浏览了这个网站,找不到类似的场景。我正在尝试运行以下代码 SELECT st.storeid, s.noofitems FROM salestrnsaction AS st, soldvia AS
请善待我,我是 Python 初学者:-) 现在,我发现编写 Python 程序的“最佳实践”是将主代码包装在“main”函数中,并执行 if "__main__"== __name__: 测试调用“
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 9 年前。 Improve
这个问题在这里已经有了答案: What is the reason to use the 'new' keyword at Derived.prototype = new Base (6 个答案)
我正尝试在 tomcat 上为我的 jersey webapp 创建一个用户登录页面,它的行为与网络上的所有其他页面一样。也就是说,用户会看到一个漂亮的登录页面而不是弹出窗口(如 BASIC tomc
我正在尝试让 Android 服务监听来电,当确实有来电时,获取来电号码并向其发送短信。 在我的服务中,我制作了一个PhoneStateListener: TelephonyManager tMana
是否有适当的地方来存储数据库的高级描述?类似于“此数据库用于存储 XYZ 以供 ABC 使用”之类的内容。这不一定是人们需要查询的信息,而是对管理系统的人有用的信息(即几个月前我试图记住几个月前我试图
下面的排序逻辑非常简单: 1. 标记不包含所选排序值的产品 2. 按所选排序值的数量降序对产品进行排序 3.隐藏不包含所选排序值的产品 我添加了简单的排序逻辑,它可以对元素进行排序(可以在控制台中预期
这个问题在这里已经有了答案: Where does Visual Studio look for C++ header files? (7 个答案) 关闭 9 年前。 所以,我在 VS2010 中开
我正在尝试连接到 MSMQ 并发送一些消息。不幸的是,项目中有关于如何做到这一点的“先前艺术”,我应该模仿它。之前的应用程序的连接方式如下: if (MSMQ in workgroup mode) {
我正在编写一个可能会被其他人使用的 ROS 节点,这就是我想要遵循通用指南的原因。有时我想为异常添加额外的信息,但我不知道该怎么做。这是一个方便的示例: 我的 ROS 节点使用 boost 库连接到串
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 4 年前。 Improve
我在摆弄 django-tinyMCE并注意到一些配置没有得到应用。这是我的 settings.py 中的代码 TINYMCE_DEFAULT_CONFIG = { 'theme' : 'ad
回顾我过去的项目,我经常遇到这个: 一位客户或经理向我提出一项任务并要求进行估算。我估计说 24 小时。他们还询问了业务分析师,据我所知,他们的经验大多是非技术性的。他们给出的估计是 16 小时。最后
我使用以下方式调用几个sql文件: :r C:\Scripts\Script1.sql :r C:\Scripts\Script2.sql :r C:\Scripts\Script3.sql 我对 :
在类构造函数中初始化 AS3 类变量“更好”吗?或者当我在类的顶部声明它们时,我可以将它们初始化为默认值吗?我问这个问题是因为当有很多类变量时,在一个地方声明它们然后在另一个地方初始化它们似乎效率很低
我有一个代码: $("#button").click(function () { for (var i = 0; i < 4; i++) {
我们的应用程序正在被翻译成多种语言,我们需要一个组合框来列出可能的语言。我们希望使用该语言的语言名称(例如,Français 表示法语)。 列出这些语言是否有任何“正确”的顺序?我们是否根据他们的
我正在尝试在 Ubuntu 12.04 中使用 Tramp/Emacs-23 来编辑远程主机文件。我的远程主机有两步验证 (RSA+Passwd)。我通过 .ssh/config 使用多路复用来确保
我是一名优秀的程序员,十分优秀!