刷新Java应用程序中的GUI对象

刷新Java应用程序中的GUI对象,java,swing,model-view-controller,Java,Swing,Model View Controller,第一次张贴。我觉得这应该是相当直截了当的,但经过搜索和尝试,我一直没有找到解决办法。我在一个非常简单的MVC程序中重新创建了我的问题——它在这个示例应用程序和我的实际应用程序中的行为都是一样的;很明显,我在两个地方都犯了同样的错误 在我的Java桌面应用程序中,GUI代码位于“视图”类中。此类严格负责GUI的外观,确保在屏幕/窗口上显示所有可视对象。“控制器”处理所有程序流,并负责监听用户事件,如按钮单击,然后调用必要的视图方法从GUI检索数据或将数据放入GUI 下面的类以一种非常简单的方式实现

第一次张贴。我觉得这应该是相当直截了当的,但经过搜索和尝试,我一直没有找到解决办法。我在一个非常简单的MVC程序中重新创建了我的问题——它在这个示例应用程序和我的实际应用程序中的行为都是一样的;很明显,我在两个地方都犯了同样的错误

在我的Java桌面应用程序中,GUI代码位于“视图”类中。此类严格负责GUI的外观,确保在屏幕/窗口上显示所有可视对象。“控制器”处理所有程序流,并负责监听用户事件,如按钮单击,然后调用必要的视图方法从GUI检索数据或将数据放入GUI

下面的类以一种非常简单的方式实现了这一点——它所做的只是绘制一个小的JFrame窗口,其中包含一个包含4个对象、3个JButton和一个JTextField的JPanel。当按下3个按钮中的任何一个时,该按钮的编号1、2或3将显示在文本字段中。只是,该字段没有更新。我在视图中有一个方法,它调用JFrame的repaint()和revalidate()方法,在按下按钮更新文本字段之后,从控制器中调用。我有一个将文本写入控制台的print语句,所以我知道这部分是有效的。我也相信文本字段的更新是有效的,因为我有一个消息对话框来显示它的值。我的理解是JFrame.repaint();应该重新绘制框架及其所有子体(其中的对象),但它不是

提前谢谢你的帮助。以下是我的示例代码:

Model.java(当前为空)

View.java

package com.techbybryan;

import javax.swing.*;
import java.awt.*;

public class View {

    JButton button1 = new JButton( "One" );
    JButton button2 = new JButton( "Two" );
    JButton button3 = new JButton( "Three" );
    JTextField jTextField = new JTextField();
    JPanel jPanel = new JPanel();
    JFrame jFrame = new JFrame( "Gui Test" );

    public View(){

        jPanel.add( button1 );
        jPanel.add( button2 );
        jPanel.add( button3 );
        jPanel.add( jTextField );
        jFrame.add( jPanel );

        jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        jFrame.setSize(new Dimension( 500, 100 ) );
        jFrame.setLocationRelativeTo( null );
        jFrame.setResizable( false );
        jFrame.setVisible( true );
    }

    public JButton getButton1() {
        return button1;
    }

    public void setButton1( JButton button1 ) {
        this.button1 = button1;
    }

    public JButton getButton2() {
        return button2;
    }

    public void setButton2( JButton button2 ) {
        this.button2 = button2;
    }

    public JButton getButton3() {
        return button3;
    }

    public void setButton3( JButton button3 ) {
        this.button3 = button3;
    }

    public JTextField getjTextField() {
        return jTextField;
    }

    public void setJTextField( JTextField jTextField ) {
        this.jTextField = jTextField;
    }

    public void repaint(){
        jFrame.revalidate();
        jFrame.repaint();
        JOptionPane.showMessageDialog( null, jTextField );
    }
}
package com.techbybryan;

import javax.swing.*;

public class Controller {
    Model      model;
    View       view;
    Controller controller;

    public Controller( Model model, View view ){
        this.model = model;
        this.view = view;
    }

    public void init(){
        view.getButton1().addActionListener( e -> setOutputText( "One" ) );
        view.getButton2().addActionListener( e -> setOutputText( "Two" ) );
        view.getButton3().addActionListener( e -> setOutputText( "Three" ) );
    }

    public void setOutputText( String textToDisplay ){
        System.out.println( textToDisplay );

        view.setJTextField( new JTextField( textToDisplay ) );
        view.repaint();
    }
}
package com.techbybryan;

public class GuiTest {

    public static void main(String[] args) {
        Model      model      = new Model();
        View       view       = new View();
        Controller controller = new Controller( model, view );

        controller.init(  );
    }
}
Controller.java

package com.techbybryan;

import javax.swing.*;
import java.awt.*;

public class View {

    JButton button1 = new JButton( "One" );
    JButton button2 = new JButton( "Two" );
    JButton button3 = new JButton( "Three" );
    JTextField jTextField = new JTextField();
    JPanel jPanel = new JPanel();
    JFrame jFrame = new JFrame( "Gui Test" );

    public View(){

        jPanel.add( button1 );
        jPanel.add( button2 );
        jPanel.add( button3 );
        jPanel.add( jTextField );
        jFrame.add( jPanel );

        jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        jFrame.setSize(new Dimension( 500, 100 ) );
        jFrame.setLocationRelativeTo( null );
        jFrame.setResizable( false );
        jFrame.setVisible( true );
    }

    public JButton getButton1() {
        return button1;
    }

    public void setButton1( JButton button1 ) {
        this.button1 = button1;
    }

    public JButton getButton2() {
        return button2;
    }

    public void setButton2( JButton button2 ) {
        this.button2 = button2;
    }

    public JButton getButton3() {
        return button3;
    }

    public void setButton3( JButton button3 ) {
        this.button3 = button3;
    }

    public JTextField getjTextField() {
        return jTextField;
    }

    public void setJTextField( JTextField jTextField ) {
        this.jTextField = jTextField;
    }

    public void repaint(){
        jFrame.revalidate();
        jFrame.repaint();
        JOptionPane.showMessageDialog( null, jTextField );
    }
}
package com.techbybryan;

import javax.swing.*;

public class Controller {
    Model      model;
    View       view;
    Controller controller;

    public Controller( Model model, View view ){
        this.model = model;
        this.view = view;
    }

    public void init(){
        view.getButton1().addActionListener( e -> setOutputText( "One" ) );
        view.getButton2().addActionListener( e -> setOutputText( "Two" ) );
        view.getButton3().addActionListener( e -> setOutputText( "Three" ) );
    }

    public void setOutputText( String textToDisplay ){
        System.out.println( textToDisplay );

        view.setJTextField( new JTextField( textToDisplay ) );
        view.repaint();
    }
}
package com.techbybryan;

public class GuiTest {

    public static void main(String[] args) {
        Model      model      = new Model();
        View       view       = new View();
        Controller controller = new Controller( model, view );

        controller.init(  );
    }
}
GuiText.java

package com.techbybryan;

import javax.swing.*;
import java.awt.*;

public class View {

    JButton button1 = new JButton( "One" );
    JButton button2 = new JButton( "Two" );
    JButton button3 = new JButton( "Three" );
    JTextField jTextField = new JTextField();
    JPanel jPanel = new JPanel();
    JFrame jFrame = new JFrame( "Gui Test" );

    public View(){

        jPanel.add( button1 );
        jPanel.add( button2 );
        jPanel.add( button3 );
        jPanel.add( jTextField );
        jFrame.add( jPanel );

        jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        jFrame.setSize(new Dimension( 500, 100 ) );
        jFrame.setLocationRelativeTo( null );
        jFrame.setResizable( false );
        jFrame.setVisible( true );
    }

    public JButton getButton1() {
        return button1;
    }

    public void setButton1( JButton button1 ) {
        this.button1 = button1;
    }

    public JButton getButton2() {
        return button2;
    }

    public void setButton2( JButton button2 ) {
        this.button2 = button2;
    }

    public JButton getButton3() {
        return button3;
    }

    public void setButton3( JButton button3 ) {
        this.button3 = button3;
    }

    public JTextField getjTextField() {
        return jTextField;
    }

    public void setJTextField( JTextField jTextField ) {
        this.jTextField = jTextField;
    }

    public void repaint(){
        jFrame.revalidate();
        jFrame.repaint();
        JOptionPane.showMessageDialog( null, jTextField );
    }
}
package com.techbybryan;

import javax.swing.*;

public class Controller {
    Model      model;
    View       view;
    Controller controller;

    public Controller( Model model, View view ){
        this.model = model;
        this.view = view;
    }

    public void init(){
        view.getButton1().addActionListener( e -> setOutputText( "One" ) );
        view.getButton2().addActionListener( e -> setOutputText( "Two" ) );
        view.getButton3().addActionListener( e -> setOutputText( "Three" ) );
    }

    public void setOutputText( String textToDisplay ){
        System.out.println( textToDisplay );

        view.setJTextField( new JTextField( textToDisplay ) );
        view.repaint();
    }
}
package com.techbybryan;

public class GuiTest {

    public static void main(String[] args) {
        Model      model      = new Model();
        View       view       = new View();
        Controller controller = new Controller( model, view );

        controller.init(  );
    }
}

非常感谢您提供的任何建设性建议;感谢您的反馈。

控制器中的此代码不正确:

view.setJTextField( new JTextField( textToDisplay ) );
控制器不应该向视图添加组件,而应该是actionlistener方法更改模型的状态,这是您无法做到的,因为您的模型类是莫名其妙的空的

简而言之,您是在反向操作——您应该首先让模型工作,然后将控件和视图连接起来,以便首先使用模型。当视图发生更改时,您的模型应该通知视图(PropertyChangeListener在这里可以很好地工作),然后视图应该根据模型的状态更新当前显示的JTextField中的显示(添加新的JTextField——很抱歉,这太疯狂了)

此外,摆脱所有这些重新绘制和重新验证,因为这些代码将不会帮助您的基本问题,而且是不必要的

还请注意,我将删除此代码:

public void setJTextField( JTextField jTextField ) {
    this.jTextField = jTextField;
}
相反,做一些更像:

public void setJTextFieldText(String text) {
    this.jTextField.setText(text);
}
不要不必要地添加组件,而是更改已有组件的状态

谢谢!setText(文本)正是编写所需的内容。我没有充分研究可用的方法,而是过分依赖IntelliJ生成的setter来处理该字段。从中吸取了一些教训。我成功地将这一点推广到了“真正的”应用程序中,这个问题就是从这个应用程序中产生的。您也给了我很多思考,关于代码属于哪里,模型应该做什么,在这个示例程序中不是这样。我会花一些时间仔细思考和试验。再次感谢。