相关疑难解决方法(0)

如何使用SwingWorker模拟缓冲的外围设备?

我正在使用这个练习作为教学工具来帮助我学习一些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)

java concurrency swing buffering swingworker

7
推荐指数
2
解决办法
1880
查看次数

Swing MVC - 事件传播和数据共享

我试图在swing应用程序中应用MVC模式.但是我面临两个主要问题,因为你有嵌套的面板层次结构,例如父 - >孩子 - >大孩子 - >大孩子.

问题1:当您有这样的层次结构时,如何在控制器和视图之间传输数据?如果我将数据从父母传递给孩子,那么就会有很多重复,如果我改变一个孩子,所有父母都需要改变.我不希望视图直接从数据库访问数据,我希望数据只通过控制器传输到视图.

问题2:如何在这种层次结构中将事件从视图传播到控制器?我正在考虑使用PropertyChangeListener.如果控制器必须采取任何操作,则将查看firePropertyChange事件.控制器将监听这些事件并执行某些操作.但是,如果我为层次结构执行此操作,那么将会出现代码重复.

我有三个可能有用的想法:

  1. 为每个面板使用控制器,但这样我最终会得到很多控制器.
  2. 使用Mediator设计模式,提供视图和控制器之间的通信.
  3. 使用将从视图中侦听所有属性更改事件的Central Reciever&Notifier,并通知感兴趣的控制器.但这只会解决我的第二个问题:

请参考下图了解第3个想法的图片.如果是第二个,调解员将进入中心.

如果有人以更好的方式实施此类问题,请评估并告知我们.

在此输入图像描述

java model-view-controller swing mediator observer-pattern

7
推荐指数
1
解决办法
571
查看次数

摆动 - 替换Qt信号/插槽

在Qt GUI中,使用信号和插槽非常方便 - 它可以解耦传递的事件.当我创建一个抛出信号的小部件时,我不必事先知道谁可以获得它,稍后connect我指定连接.

Java/Swing中的并行是什么?你能指出这个问题上的好资源吗?

java swing qt pyqt signals-slots

6
推荐指数
1
解决办法
3258
查看次数

Swing:JDialogs如何与JFrame对话

我正在构建我的第一个Swing应用程序,并试图找出我的JDialogs - 当用户选择JMenuItem时专门调用 - 可以更新JFrame的主客户区域中的组件,这是整个应用程序的父"窗口" .

这是我提出的设计,但不知道它是否:(1)只是简单的坏,(2)不是标准(因此最好)的方式,或(3)如果我完全偏离基础这里.任何建议都非常感谢.

基本上,用户选择JMenuItem,它启动JDialog.用户与对话框中的组件交互,然后单击"完成".如果一切都有效,那么JDialog会关闭,我希望父窗口(一个JFrame)更新其状态(并最终波及其组件).

我的设计:

有一个AppStateController是JFrame子类(我的应用程序)的成员.然后我将创建一个AppStateChangeListenerAppStateChangeEventObject子类,以便每当对话框验证并关闭时,它都会触发一个AppStateChange事件.由于父JFrame是该事件的唯一注册侦听器,因此我可以定义一个处理程序来获取传递给它的事件.我会确保AppStateChangeEvent有足够的元数据来描述所有可能的更改.

从理论上讲,我喜欢这种方法:每次不同的事件发生时,它应该是干净的,并且没有"spaghetti"类型的多个控件调用.但是,我担心它可能有点矫枉过正.

最佳实践在这里有什么要求?我不是一个真正的GUI人!

java user-interface swing

6
推荐指数
1
解决办法
1316
查看次数

具有多窗口设计的 mvc

我正在开发一个应用程序,我正在使用 MVC 模式。目前我的计划是为每个出现的窗口设置一个 MVC 模式。例如,我的登录窗口有自己的 mvc 系统。他们进行选择的另一个窗口有自己的 mvc 系统。那么mainview就有了自己的mvc系统...

这看起来有点傻。我想知道这是否正常,让每个窗口都有自己的 mvc?如果没有,我怎样才能更好地安排?

我遇到的问题是,如何让登录窗口 mvc 正确调用选择窗口,然后在他们进行选择后,选择窗口如何调用主视图窗口?

谢谢你的帮助!如果您需要更多信息,请告诉我。

java oop model-view-controller user-interface design-patterns

6
推荐指数
1
解决办法
1849
查看次数

Java Swing:如何正确实例化GUI并传递域对象?

我有一个嵌套面板的GUI(带有嵌套面板的标签等).我需要将域对象传递给深层嵌套的面板.我可以想到两种方式:

  • 在一个地方实例化所有gui对象,比如帧类.这将使传递域对象变得简单,但Frame类将是巨大的并且难以管理.

  • 每个面板都有自己的类,我们在其中实例化和布局其
    组件.现在它易于维护,类很干净,但是如何
    传递我的域对象链呢?我不想通过甚至不知道它们
    存在的面板构造器来链接它们.顶级面板将有大量的这些对象开始.

Niether的方式似乎是一种洗礼.你通常如何接受这个?

java oop swing design-patterns

6
推荐指数
1
解决办法
1718
查看次数

Swing - 在视图之间进行交互的最佳方式?

在Swing应用程序中,在两个视图之间发送数据(交互)的最佳方法是什么?

看一下SCJP 6学习指南中的耦合会议,它说:

所有重要的OO应用程序都是许多类和接口协同工作的组合.理想情况下,OO系统中对象之间的所有交互都应该使用对象各自类的API,换句话说,契约.

如果我理解这是正确的,更好的方法是为每个视图创建接口(契约),如果需要,使用此接口方法来检索数据.这是一个好方法吗?花很多时间创建大量接口来说明视图所暴露的内容是否合适?

我认为另一种方法是使用类来保存视图的数据(模型).在这种情况下,直接访问这个模型类是一个好方法吗?

提前致谢.

java swing design-patterns

6
推荐指数
1
解决办法
367
查看次数

如何避免在Swing中耦合View和Controller

我最近遇到了一个试图在Swing中实现模型 - 视图 - 控制器的问题.

我有一个由子面板组成的GUI类,这些子面板由其他子面板组成.现在,在其中一个子子面板中有一个JButton.在ActionListenerfor for this中JButton我想调用控制器中的方法.为了做到这一点,我需要将控制器深入到GUI的内部,到达JButton所在的子子面板.因此,在本次的子面板,我需要一个连接ActionListenerJButton并填写actionPerformed()调用,我想在控制器中调用该方法.

我相信你们都看到了这个问题.是否有任何好方法可以避免将控制器深入到GUI的内部.

我唯一的想法是让控制器成为一个单身人士将它从视图中分离出来,但我听说单身人士通常是邪恶的.

关于这个问题的任何建议都将非常感激.

java model-view-controller swing actionlistener propertychangelistener

6
推荐指数
1
解决办法
577
查看次数

Java:如何从AbstractAction对象引用GUI组件?

通常需要根据另一个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)

java swing jbutton abstract-action

6
推荐指数
2
解决办法
3946
查看次数

使用Java中的Swing在GUI开发中正确实现MVC模式

首先,我来自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 model-view-controller user-interface swing

6
推荐指数
2
解决办法
2万
查看次数