相关疑难解决方法(0)

重写到MVC后GUI无法正常工作

我正在练习MVC风格的编程.我在一个文件中有一个Mastermind游戏,工作正常(可能除了"Check"按钮在开始时不可见).

http://paste.pocoo.org/show/226726/

但是当我把它重写为模型,视图,控制器文件时 - 当我点击空Pin(应该更新,并重新绘制新颜色)时 - 注意到了.谁能在这里看到任何问题?我尝试在不同的地方放置repaint(),但它根本不起作用:/

主要:

public class Main { 
    public static void main(String[] args){
        Model model = new Model();
        View view = new View("Mastermind", 400, 590, model);
        Controller controller = new Controller(model, view); 
        view.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

型号:

import java.util.Random;

public class Model{
    static final int
    LINE = 5,
    SCORE = 10, OPTIONS = 20;
    Pin pins[][] = new Pin[21][LINE];
    int combination[] = new int[LINE];
    int curPin = 0;
    int turn = 1;
    Random generator = new Random(); …
Run Code Online (Sandbox Code Playgroud)

java model-view-controller user-interface swing

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

3 Swing应用程序设计:哪个最好?

我是桌面应用程序开发的新手,今年夏天我有一个非常大的项目.问题是代码必须非常清晰,所以当我更新代码时,我不会遇到麻烦.

结果,我想要一个良好的"关注点分离".对我来说最困难的部分是视图 - 控制器分离.

现在,我已经阅读了很多教程,讨论等.我已经以3种不同的方式设计了一个迷你应用程序.该应用程序很简单:单击将标签转换为"Hello world"的按钮.

你怎么看待这3个设计?

有没有更好的设计来满足我的期望?

设计1

View1.java:

public View1() {
    initComponents();
    this.controller = new Controller1(this);
}

private Controller1 controller;

public void updateLabel(String message){
    this.jLabel1.setText(message);
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    this.controller.doSomething();
}

private void initComponents() {
...
jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });
...}
Run Code Online (Sandbox Code Playgroud)

Controller1.java:

public class Controller1 {
    public Controller1(View1 v){
        this.view = v;
    }

    public void doSomething(){
        this.view.updateLabel("Hello world");
    }

    private View1 view;
}
Run Code Online (Sandbox Code Playgroud)

设计2

View2.java:

public View2() {
        initComponents(); …
Run Code Online (Sandbox Code Playgroud)

java architecture model-view-controller swing

15
推荐指数
2
解决办法
3658
查看次数

如何用Swing在Java中正确实现MVC?

如果您想了解更多详情,请告诉我们,或参考此问题的最后几行.我已经阅读了很多内容,我觉得我正在把一些简单的东西变成复杂的东西而且我仍然被困在那里,所以也许你可以在那些非常具体的方面帮助我.

我使用的是Netbeans IDE 7和JDK 7,没有框架.第一个窗口是JFrame,所有其他窗口都是JDialogs,模态=真.

问题:

  1. 如何使用swing正确实现MVC模式?从下面的想法哪一个更好:(A)或(B)?或者可能是另一个......为什么它更好?

    (A)主要:

    MyModel model
    MyView view(model)
    
    Run Code Online (Sandbox Code Playgroud)

    我的看法:

    MyController(this, model)
    
    Run Code Online (Sandbox Code Playgroud)

    (B)
    主要:

    MyModel model
    MyView View
    MyController controller(view, model)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当我在MainFrame中单击jbutton1时,我需要它来打开SettingsFrame进行编辑设置.我应该在哪里实例化SettingsFrame的View,Model和Controller?在MainFrame控制器?

  3. 在MVC组织和实现方面,我应该如何处理(显然)缺少一个或两个MVC"支路"(模型或视图或控制器)的更多特定功能?我应该为他们创建空课吗?

    a. The implementation of a TrayIcon
    b. A URL connection class (an HttpsUrlConnection which will update data in the main jframe and also upload/download files)
    c. A Directory Monitor (which will update data in the main jframe and also use the urlconnection to download a file)
    d. My own implementation of TableModel
    e. json …
    Run Code Online (Sandbox Code Playgroud)

java model-view-controller user-interface swing jframe

15
推荐指数
1
解决办法
1万
查看次数

MVC模式:哪个更好?对于视图或控制器来创建和引用另一个?

我们正在制作一个相当大的Swing应用程序,它必须实现MVC模式.该应用程序目前看起来像这样:


有很多观点.它们以分层方式创建,其中一个主视图包含(并创建)多个视图,这些视图都包含它们自己的子视图集等.每个视图通过调用模型从模型独立地从其他视图中检索信息必要时的静态方法.

还有不少控制器都完全相互分离.每个控制器都属于一个视图.每个视图都创建自己的控制器,并将控制器添加为用户输入的侦听器.控制器从视图接收事件,然后通过模型静态方法修改模型.当视图调度不影响模型但仅影响视图的事件时,视图会自行处理这些事件 - 而不通知控制器事件.也就是说,控制器完全不知道视图,控制器的目的只是处理模型的操作.| 编辑:控制器目前是他们观点的附件; 它们只包含事件处理的逻辑.也就是说,控制器本身不是组件,并且不包含组件.它们的实现方式与以下示例相同:MVC示例 |

应用程序中的模型非常被动,甚至没有侦听器(它代表数据库).它从控制器接收更新.


在此示例中,视图拥有控制器.如果控制器拥有并创建视图,并且如果让视图不知道控制器而不是相反的情况,那么在一般情况下会更好吗?在那种情况下,为什么?这将如何设计?如果没有,是否有更好的设计,控制器仍然没有意识到这些观点?或者,也许是他们中最好的设计?

编辑:

原始MVC定义中所述:

"视图负责建立这种相互通信......"似乎表明视图创建了控制器,或者至少具有对控制器的初始引用,反之亦然.

所以这至少是一种可行的方法(它是一种有效的MVC模式),但主要问题仍然存在; 哪个更好,最好的设计会是怎样的?特别是在处理与其各自视图密切相关的许多控制器时?

编辑:引用控制器的另一个视图示例:Oracles示例

java model-view-controller swing design-patterns decoupling

11
推荐指数
1
解决办法
2302
查看次数

使用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万
查看次数

Model-View-Presenter被动视图:bootstraping - 谁最初显示视图?

在Passive View Model View Presenter模式中,谁负责显示视图?我找到了其他MVP版本的相关答案,但它们似乎不适用于被动视图版本.

我有一个使用Java Swing的具体示例.它非常简单,但基本上我们有一个SwingCustomersView内部构建带有表(客户列表)的JPanel和一个显示当前所选客户年龄的标签.在表格中选择客户后,演示者将从模型中检索选定的客户年龄.我认为这个例子是MVP被动视图的正确实现,但如果我错了,请纠正我.

问题是我们如何引导这些类?例如,如果我们想要SwingCustomersView在JFrame中显示.如何做到这一点?我想象的是:

void launcher() {
    CustomersModel model = new CustomersModel();
    SwingCustomersView view = new SwingCustomersView();
    CustomersPresenter presenter = new CustomersPresenter(view, model);
}
Run Code Online (Sandbox Code Playgroud)

这是初始接线,但尚未显示任何内容.我们如何实际显示视图?(1)launcher(),(2)SwingCustomersView或(3)是否有责任CustomersPresenter显示视图?不幸的是,我不相信这些都是非常好的,你可以从下面的想法中看到.也许还有另一种方式?

(1.a):发射器

制作SwingCustomersView扩展JFrame,并将其内部JPanel添加到自身的内容窗格中.然后我们可以这样做:

void launcher() {
    CustomersModel model = new CustomersModel();
    SwingCustomersView view = new SwingCustomersView();
    CustomersPresenter presenter = new CustomersPresenter(view, model);
    view.setVisible(true); // Displays the view
}
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,我们不会将presenter实例用于任何事情.这不奇怪吗?它只是用于布线,我们也可以删除变量而只是做new CustomersPresenter(view, model).

(2):SwingCustomersView

SwingCustomersView拿一个Container …

java mvp swing

5
推荐指数
1
解决办法
2321
查看次数

带有匿名EventListener的JPanel - 为什么GC不会破坏监听器?

我一直在仔细阅读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必须保持活动才能正常工作,即使它因某些奇怪的原因没有名称?

那么,有两个真正的问题:

  • 为什么GC不会破坏对象?
  • 这确实是一个糟糕的设计选择,还是有一些方法我不知道从实例化查看器的类访问控制器?

我想为这个开源库做贡献,我改变的第一个想法是改变JMapViewer类以使一个字段引用其控制器,并更改构造函数以将当前的匿名控制器分配给这个新字​​段.但是,我想确保我不会无知地遗漏某些东西.我在整个代码库中搜索了文本DefaultMapController,它只出现在它自己的类定义中,以及JMapViewer构造函数中的匿名实例化中.


编辑:

确实有一种方法可以通过使用该java.awt.Component方法来访问匿名侦听器getMouseListeners().从技术上讲,在我的应用程序中,我可以搜索此集合的实例DefaultMapController,并使用它来访问我需要用来更改控制器选项的方法.

但是,为了扮演魔鬼的拥护者,如果我按照原始想法并给地图作为其控制器的参考,现在我有一种循环参考(地图知道控制器和控制器知道地图).这是一个坏主意吗?

java swing garbage-collection event-listener jmapviewer

2
推荐指数
1
解决办法
772
查看次数

使用BorderLayout将4个内嵌组件添加到JPanel

在我的应用程序中,有4个面板.我需要将它们插入主面板,使用BorderLayout.4个面板是......

  1. 一个薄的图像条.
  2. 正好在上方的4个按钮
  3. 覆盖整个页面的TextField.
  4. 一个即将结束.

这是我的代码......

    add(imageLabel, BorderLayout.NORTH);
    add(buttonPanel,BorderLayout.PAGE_START);
    add(logScrollPane, BorderLayout.CENTER);
    add(about, BorderLayout.PAGE_END);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,buttonPanel消失了.我怎样才能达到我的需要?

java swing jpanel jframe border-layout

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