这个是一个很长的,下面是我的"主要"类,它拥有我的大多数UI逻辑和所有的听众等.无论如何你可以看到我把很多代码卡在一个类中,整个事情似乎难以理解但它确实有效.
我在一个单独的包中有一个单独的GUI类,我在我的initUI()函数中调用该类,然后从这里引用所有组件并编写将这些组件作为参数的方法,并为这些组件添加特定的监听器.我还引用方法setter/getters的每个GLOBAL变量而不是直接引用它们.正如您所看到的,函数列表正在堆积在initUI()中,而我甚至都不在那里.
我猜这甚至不是专业的方法,你能不能给我提供新手提示,例子和建议如何改进所有这些代码,因为即使这一切都有效,因为它应该是非常非常丑陋的看,有没有书籍或 教程解释如何编写更大的应用程序的方法.
即使我在这个GUI中途完成这个GUI我喜欢尝试,并且我被告知JavaFX对于使用Java GUI更好,而且你获得的代码更令人愉快,就像你在Java Swing中得到的那样但在另一方面,JavaFX有很多关于其尚未完全准备好使用的投票.
无论如何这里是我的代码:
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 …Run Code Online (Sandbox Code Playgroud) 我有一个有许多部分的PieChart,这个PieChart的图例呈现为一行.如何将图例渲染为两列?
我不想尝试遵循MVC模式.在互联网上,我看到最着名的例子是计算器,例如这里.我开始使用这种MVC模式的实现.但是现在我对控制器中的动作监听器有些疑虑,因为它们倾向于查看.
有很多变化与视图相关的主要原因 - 字体,颜色,边框等.此外还有仅仅修改视图的actionlisteners!因此,在控制器中实现这样的actionlistener要困难得多(与视图中的简单内部匿名类相比).此外,它需要从控制器访问许多视图元素.
我有一个想法是在控制器和一些视图中保留一些actionlisteners,但它可能导致将来混乱.所以我想听听其他人的想法.
PS这个问题与许多ActionListener的MVC模式不重复
我在学习Java中的线程时遇到了一些问题.目标是进行模拟,向我们展示兔子在某种类型的板上如何从狼群中奔跑.每只狼和每只兔子都应该成为一个线索.所以我在Test类的main方法中创建了一个GUI,并创建了一个实现Runnable接口的新类.我认为这很容易也很合乎逻辑.但是现在,我如何AddRabbit从这些线程调用该方法?因为非常线程应该像下面这样做:
但是怎么样?
我在大学的任务是使用观察者模式制作应用程序来通过主题(编程基础)。我想展示更多的知识,它包含在教学大纲中,但这对我来说适得其反。我用 Swing + sql 制作了一个应用程序,严重依赖 ActionListeners,我认为这是观察者模式的一个重要示例。不幸的是,我的项目被拒绝了,因为我没有编写自己的观察者模式实现。
我的问题是,是否有可能使用 Swing 来替换默认的操作侦听器?我什至无法检查其外部按钮的状态。我现在真的很困惑,尽管我知道模式的原理并寻求你的帮助。
我正在尝试使用MVC架构模式构建一个简单的Java Swing应用程序.我所做的是在我的视图中创建用户界面组件(作为私有),并具有返回组件的公共方法.然后由控制器调用这些方法,通过它我可以为事件/动作侦听器编写方法.以下是一个示例示例:
视图:
private JButton btnAdd;
public JButton getBtnAdd(){
return btnAdd;
}
Run Code Online (Sandbox Code Playgroud)
控制:
myGuiFrame gui = new myGuiFrame();
//on add button clicked
gui.getBtnAdd().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//calls to model
}
});
Run Code Online (Sandbox Code Playgroud)
这个实现是否正确?
如果是这样,那么我遇到了FocusListeners的问题.当我在视图中创建FocusListener时,会在视图中创建focusLost和focusGained方法.
private FocusListener l;
someComponent.addFocusListener(l);
l = new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
};
Run Code Online (Sandbox Code Playgroud)
我希望所有的事件处理程序都在我的控制器中.我的问题是......有没有办法可以从我的控制器调用/声明focusLost和focusGained方法?我试图将FocusListener定义为public,以便我可以在我的控制器中定义它:
视图:
public FocusListener l;
public someComponentType someComponent; …Run Code Online (Sandbox Code Playgroud) 我一直在仔细阅读JMapViewer的开源代码.如果有其他人希望查看它,请检查SVN.
简而言之,主要类是JMapViewer,它是一个扩展JPanel.还有一种叫非常重要的一类DefaultMapController充当MouseListener主类.
我注意到的第一个奇怪的事情是观众没有对控制器的引用.该JMapViewer构造器实例的一个匿名实例DefaultMapController,就像这样:
public JMapViewer() {
// other stuff
new DefaultMapController(this);
}
Run Code Online (Sandbox Code Playgroud)
在我看来这是一个糟糕的设计选择,因为控制器有很多方法(选项,切换等 - 下面显示的例子),现在根本无法访问,那么它们有什么用呢?
public void setMovementMouseButton(int movementMouseButton) {
// changes which mouse button is used to move the map
}
Run Code Online (Sandbox Code Playgroud)
控制器确实有一个对查看器的引用,如上面的第一个片段所示,这是它能够控制的方式.
然而,那时我想到的东西更怪异!如果这个监听器的匿名实例没有引用,为什么它甚至可以存活?GC不应该迅速摧毁它吗?或者GC是否足够聪明,知道引用live的侦听器类也JComponent必须保持活动才能正常工作,即使它因某些奇怪的原因没有名称?
那么,有两个真正的问题:
我想为这个开源库做贡献,我改变的第一个想法是改变JMapViewer类以使一个字段引用其控制器,并更改构造函数以将当前的匿名控制器分配给这个新字段.但是,我想确保我不会无知地遗漏某些东西.我在整个代码库中搜索了文本DefaultMapController,它只出现在它自己的类定义中,以及JMapViewer构造函数中的匿名实例化中.
编辑:
确实有一种方法可以通过使用该java.awt.Component方法来访问匿名侦听器getMouseListeners().从技术上讲,在我的应用程序中,我可以搜索此集合的实例DefaultMapController,并使用它来访问我需要用来更改控制器选项的方法.
但是,为了扮演魔鬼的拥护者,如果我按照原始想法并给地图作为其控制器的参考,现在我有一种循环参考(地图知道控制器和控制器知道地图).这是一个坏主意吗?
但我无法根据组节点名称设置自定义打开/关闭图标,例如节点可以称为电子邮件(因此有一个包络图标很好)或者一组可能被称为任务等等.
我试图通过重写getTreeCellRendererComponent类的方法来做到这一点DefaultTreeCellRenderer
但是改变icon当前的电流node只会影响下一个节点!
如何为各个组设置自定义打开/关闭图标?
请看一下我的代码:
Employee.java
package com.ehsunbehravesh.swing;
import java.util.Random;
public class Employee {
public String name;
public int id;
public boolean isBoss;
public Employee[] employees;
public Employee(String name, boolean isBoss) {
this.name = name;
this.isBoss = isBoss;
this.id = new Random(System.currentTimeMillis()).nextInt(Integer.MAX_VALUE);
}
@Override
public String toString() {
return this.name;
}
static String randomName() {
String chars = "abcdefghijklmnopqrstuvwxyz";
StringBuilder builder = new StringBuilder();
Random r = new Random(System.currentTimeMillis());
int length …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在Swing中清晰地组织我的UI代码的方法.
假设我的UI代码按以下方式构建:
class MainWindow extends JFrame {
// SomePanel panel is added here
}
class SomePanel extends JPanel {
// buttons, checkboxes and so on are added here
}
Run Code Online (Sandbox Code Playgroud)
假设我在main方法中实例化一个MainWindow对象:
MainWindow frame = new MainWindow("I am an App");
Run Code Online (Sandbox Code Playgroud)
在main-method中监听按钮的ActionEvents(在SomePanel中声明,在MainWindow中声明)的最佳做法是什么?
非常感谢您的帮助!
我想制作一个应用程序,它将作为多个服务器的接口.原因:在默认情况下提供的web iface(我们无法改变它)是我们想念的一些事情,很少有人可以做得更好,并且确保某些东西的自动化会使工作更容易.
我有什么:几乎完成的类与服务器应用程序的Web界面进行通信.
GUI描述:对于某种版本0.1:用户名的文本字段,选择服务器的单选按钮和一个"go"按钮.然后几个(4-12)操作按钮操作数据,2x文本区域与结果,一个标签与一些文本数据 - 我可以管理这个.然后我需要查看数据 - 网格MxN将加载数据,预期大小:7-15列,通常10行或更少,但很少它可以超过1k(甚至更多,但我不需要所有在这种情况下对用户可见).
我需要的是:只是一个建议.我希望从一个简单的版本开始(我已经开始研究它了,但是我坚持太多的事情 - 95%的cos和GUI的全新,5%的cos我是java的新手).我检查了很多教程,但它们都很简单.
真正的问题:
1)验证.在MVC控制器中应该处理所有用户操作 - 它是通过view的方法完成的,类似于button.addActionListener(param); anotherButton.addActionListener(paramp; ...?
1b)我已经看到所有通过一个(嵌套)类实现,然后检查源或smth - 是吗?会有很多按钮等.
2)如何实现数据网格,当我需要对click/dbl点击进行操作时?
4)第一行是标题,其余的应该是可滚动的 - 如果它在网格中或在外面(它自己的网格):
4a)如何确保标题的大小(宽度)与数据中的相同(我不想设置直接大小)
4b)到目前为止,我没有创建任何可滚动的东西,但我认为这很糟糕.如何确保标题将保留在某个位置,其余的可以滚动?
5)如何实施"数据更新"?我有JPanel从中删除网格组件,然后我创建新的并添加数据(简单,但perhapss有另一种方式).最初的改进之一是排序 - 使用与新内容相同的方式?
非常感谢任何答案,我知道这不是很具体,但我发现的例子太简单了.
我计划了很多增强功能,但未来的这些功能我并不介意多次重做GUI/Controller,至少我会练习,但我不想完成代码的一部分并意识到我必须重写一半的控制器和1/4的视图才能实现.
注意:我打算在工作中使用它作为我的工具(如果事情正确,我可以通过几次点击完成我工作的25-50%:-)所以我的意思是这个).
注意#2:我不是编程的新手,但我从来没有创建过GUI(这就是为什么我的菜单栏有2个项目和3个组件的GUI,几乎完成了web-iface连接).
注意#:3个可拖动数据标题,标签数据视图 - 这就是未来的计划:-)
java ×10
swing ×9
architecture ×1
focus ×1
icons ×1
jfreechart ×1
jmapviewer ×1
jpanel ×1
jtree ×1
legend ×1
listener ×1
oop ×1
render ×1
rendering ×1