我正在使用这个练习作为教学工具来帮助我学习一些Java GUI编程概念.我正在寻找的是一般性的理解,而不是一个特定问题的详细解决方案.我希望编码这个"正确"将教会我如何处理未来的多线程问题.如果这对于这个论坛来说太笼统了,那么它可能属于程序员吗?
我正在模拟读卡器.它有一个GUI,允许我们将卡加载到料斗中并按下Start等,但它的主要"客户端"是CPU,在单独的线程上运行并请求卡.
读卡器保持单个缓冲区.如果卡片请求进入且缓冲区为空,读卡器必须从料斗读取卡片(需要1/4秒,这是1962年).在将卡读入缓冲区后,读卡器将缓冲区发送到CPU,并在下一个请求之前立即启动另一个缓冲区加载操作.
如果不仅缓冲器是空的,而且料斗中没有卡,那么我们必须等到操作员将料斗放入料斗并按下Start(它始终启动缓冲加载操作).
在我的实现中,卡请求以invokeLater() Runnables在EDT上排队的形式发送到读卡器.在myRunnable.run()时间,无论是一个缓冲器将可用(在这种情况下,我们可以将其发送到CPU和开球另一个缓冲器负载操作),或缓冲区将是空的.如果它是空的怎么办?
两种可能性:(a)飞行中已经有缓冲加载操作,或(b)卡漏斗是空的(或尚未启动).在任何一种情况下,让EDT等待是不可接受的.工作(和等待)必须在后台线程上完成.
为了简单起见,我尝试生成一个SwingWorker来响应每个卡请求,而不管缓冲区的状态如何.伪代码是:
SwingWorker worker = new SwingWorker<Void, Void>() {
public Void doInBackground() throws Exception {
if (buffer.isEmpty()) {
/*
* fill() takes 1/4 second (simulated by Thread.sleep)
* or possibly minutes if we need to have another
* card deck mounted by operator.
*/
buffer.fill();
}
Card card = buffer.get(); // empties buffer
/*
* Send card to CPU
*/
CPU.sendMessage(card); // <== (A) put card in msg queue …Run Code Online (Sandbox Code Playgroud) 我试图在swing应用程序中应用MVC模式.但是我面临两个主要问题,因为你有嵌套的面板层次结构,例如父 - >孩子 - >大孩子 - >大孩子.
问题1:当您有这样的层次结构时,如何在控制器和视图之间传输数据?如果我将数据从父母传递给孩子,那么就会有很多重复,如果我改变一个孩子,所有父母都需要改变.我不希望视图直接从数据库访问数据,我希望数据只通过控制器传输到视图.
问题2:如何在这种层次结构中将事件从视图传播到控制器?我正在考虑使用PropertyChangeListener.如果控制器必须采取任何操作,则将查看firePropertyChange事件.控制器将监听这些事件并执行某些操作.但是,如果我为层次结构执行此操作,那么将会出现代码重复.
我有三个可能有用的想法:
请参考下图了解第3个想法的图片.如果是第二个,调解员将进入中心.
如果有人以更好的方式实施此类问题,请评估并告知我们.

在Qt GUI中,使用信号和插槽非常方便 - 它可以解耦传递的事件.当我创建一个抛出信号的小部件时,我不必事先知道谁可以获得它,稍后connect我指定连接.
Java/Swing中的并行是什么?你能指出这个问题上的好资源吗?
我正在构建我的第一个Swing应用程序,并试图找出我的JDialogs - 当用户选择JMenuItem时专门调用 - 可以更新JFrame的主客户区域中的组件,这是整个应用程序的父"窗口" .
这是我提出的设计,但不知道它是否:(1)只是简单的坏,(2)不是标准(因此最好)的方式,或(3)如果我完全偏离基础这里.任何建议都非常感谢.
基本上,用户选择JMenuItem,它启动JDialog.用户与对话框中的组件交互,然后单击"完成".如果一切都有效,那么JDialog会关闭,我希望父窗口(一个JFrame)更新其状态(并最终波及其组件).
我的设计:
有一个AppStateController是JFrame子类(我的应用程序)的成员.然后我将创建一个AppStateChangeListener和AppStateChangeEventObject子类,以便每当对话框验证并关闭时,它都会触发一个AppStateChange事件.由于父JFrame是该事件的唯一注册侦听器,因此我可以定义一个处理程序来获取传递给它的事件.我会确保AppStateChangeEvent有足够的元数据来描述所有可能的更改.
从理论上讲,我喜欢这种方法:每次不同的事件发生时,它应该是干净的,并且没有"spaghetti"类型的多个控件调用.但是,我担心它可能有点矫枉过正.
最佳实践在这里有什么要求?我不是一个真正的GUI人!
我正在开发一个应用程序,我正在使用 MVC 模式。目前我的计划是为每个出现的窗口设置一个 MVC 模式。例如,我的登录窗口有自己的 mvc 系统。他们进行选择的另一个窗口有自己的 mvc 系统。那么mainview就有了自己的mvc系统...
这看起来有点傻。我想知道这是否正常,让每个窗口都有自己的 mvc?如果没有,我怎样才能更好地安排?
我遇到的问题是,如何让登录窗口 mvc 正确调用选择窗口,然后在他们进行选择后,选择窗口如何调用主视图窗口?
谢谢你的帮助!如果您需要更多信息,请告诉我。
java oop model-view-controller user-interface design-patterns
我有一个嵌套面板的GUI(带有嵌套面板的标签等).我需要将域对象传递给深层嵌套的面板.我可以想到两种方式:
在一个地方实例化所有gui对象,比如帧类.这将使传递域对象变得简单,但Frame类将是巨大的并且难以管理.
每个面板都有自己的类,我们在其中实例化和布局其
组件.现在它易于维护,类很干净,但是如何
传递我的域对象链呢?我不想通过甚至不知道它们
存在的面板构造器来链接它们.顶级面板将有大量的这些对象开始.
Niether的方式似乎是一种洗礼.你通常如何接受这个?
在Swing应用程序中,在两个视图之间发送数据(交互)的最佳方法是什么?
看一下SCJP 6学习指南中的耦合会议,它说:
所有重要的OO应用程序都是许多类和接口协同工作的组合.理想情况下,OO系统中对象之间的所有交互都应该使用对象各自类的API,换句话说,契约.
如果我理解这是正确的,更好的方法是为每个视图创建接口(契约),如果需要,使用此接口方法来检索数据.这是一个好方法吗?花很多时间创建大量接口来说明视图所暴露的内容是否合适?
我认为另一种方法是使用类来保存视图的数据(模型).在这种情况下,直接访问这个模型类是一个好方法吗?
提前致谢.
我最近遇到了一个试图在Swing中实现模型 - 视图 - 控制器的问题.
我有一个由子面板组成的GUI类,这些子面板由其他子面板组成.现在,在其中一个子子面板中有一个JButton.在ActionListenerfor for this中JButton我想调用控制器中的方法.为了做到这一点,我需要将控制器深入到GUI的内部,到达JButton所在的子子面板.因此,在本次的子面板,我需要一个连接ActionListener到JButton并填写actionPerformed()调用,我想在控制器中调用该方法.
我相信你们都看到了这个问题.是否有任何好方法可以避免将控制器深入到GUI的内部.
我唯一的想法是让控制器成为一个单身人士将它从视图中分离出来,但我听说单身人士通常是邪恶的.
关于这个问题的任何建议都将非常感激.
java model-view-controller swing actionlistener propertychangelistener
通常需要根据另一个GUI对象的状态更改其他GUI对象的行为.例如,当按下按钮时,标签应更改其名称.但是,当我使用AbstractAction对象时,JButton myButton = new JButton(myButtonAction);我需要引用继承自AbstractAction的对象中的GUI对象.我应该只是在GUI中创建AbstractAction对象,然后将所有必要的GUI引用传递给AbstractAction对象,还是可以认为是坏样式?
为了使它更具体:
// AbstractAction
public class MyAction extends AbstractAction {
public MyAction(String name,
String description, Integer mnemonic, JLabel) {
super(name);
putValue(SHORT_DESCRIPTION, description);
putValue(MNEMONIC_KEY, mnemonic);
}
public void actionPerformed(ActionEvent e) {
// do something
}
}
}
public class GUI{
public Action myAction = null;
public GUI(){
JLabel label = new JLabel("text");
//This is not a good idea:
myAction = new MyAction("some text" , desc, new Integer(KeyEvent.VK_Q), label);
JButton myButton = new JButton(myAction);
}
}
Run Code Online (Sandbox Code Playgroud) 首先,我来自MVC的大背景,当我开始使用PHP时,我浏览了很多次,尝试用PHP完善我的MVC-Like设计.很多人都喜欢回答了很多帮助我的答案.
但是在Swing中开始GUI开发之后,关于Swing中MVC的答案是完全不同的.例如,模型也是一种观点?根据Oracle的建议 TextElementModel在这里没有任何逻辑业务,它所做的只是标记(设置颜色等)和设置数据,如设置文本等.当我用PHP开发时,没有这样的事情,AbstractModel因为我总是被告知模型不是一个类,或者更多,它是一个处理逻辑业务的整个层.
在PHP中,我使用了服务,数据映射器和域对象,这个惊人的答案提示我在PHP中帮助了我:如何在MVC中构建模型?
在再次阅读之后,我想在Java中做一个类似的事情:
我有ControllerContainer创建所有控制器:
public class ControllerContainer {
private JFrame frame;
public ControllerContainer(JFrame rune) {
this.frame = frame;
}
public void initControllers() {
Atest test = new Atest(frame);
test.registerView("test", new ViewTest(test));
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我将带有实例的名为"test"的视图添加ViewTest到控制器中,现在它将在框架中可见,并且可以接受输入.
我的Controller班级,应该是抽象的,但我还没有把它抽象化:
public class Controller {
private JFrame frame;
private Map<String, Component> views = new HashMap<String, Component>();
public Controller(JFrame frame) {
this.frame = frame;
}
protected void registerView(String title, Component c) {
this.views.put(title, …Run Code Online (Sandbox Code Playgroud) java ×10
swing ×9
oop ×2
buffering ×1
concurrency ×1
jbutton ×1
mediator ×1
pyqt ×1
qt ×1
swingworker ×1