GUI中更新数据和传递参数的方法

Method to update data in GUI and deliver parameter

我在处理我的项目时遇到问题时感到困惑。 以下代码是抽象版本。顺便说一句,我很难过,但我必须这样处理~~

主要入口和框架

package com.ryougi.repaint;

import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;

public class RepaintTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(()-> {
            JFrame frame = new TableFrame();
            frame.setVisible(true);
        });
    }
}

class TableFrame extends JFrame {

    private JScrollPane scrollPane;
    private JLabel label;
    private JButton button;
    private String data = "Old Data";

    public TableFrame() {
        setTitle("TableFrame Frame");
        setSize(960, 540);
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        initLayout();
    }

    public void initLayout() {
        button = new JButton("Add");
        label = new JLabel("Old Data");
        scrollPane = MyModule.MyScrollPane(data);

        // Style of scrollPane
        scrollPane.setBounds(0, 0, 960, 360);
        scrollPane.setBackground(Color.CYAN);

        // Style of button
        button.setBounds(420, 400, 120, 40);
        button.setBorder(null);
        button.setBackground(Color.PINK);

        // Listener of button
        button.addMouseListener(new BtnClickListener(this));

        add(scrollPane);
        add(button);
    }

    public JScrollPane getScrollPane() {
        return scrollPane;
    }

    public void setScrollPane(JScrollPane scrollPane) {
        this.scrollPane = scrollPane;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

自主设计模块

package com.ryougi.repaint;

import javax.swing.JLabel;
import javax.swing.JScrollPane;

public class MyModule {
    private static JScrollPane scrollPane;
    private static JLabel label;

    public static JScrollPane MyScrollPane(String data) {
        label = new JLabel(data);
        scrollPane = new JScrollPane(label);
        return scrollPane;
    }
}

监听器

package com.ryougi.repaint; 
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class BtnClickListener extends MouseAdapter {
    private String data = "New Data";
    private JFrame frame;

    public BtnClickListener(JFrame frame) {
        this.frame = frame;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        super.mouseClicked(e);
        // ((TableFrame) frame).setData(data);
        ((TableFrame) frame).setScrollPane(MyModule.MyScrollPane(data));
        ((TableFrame) frame).getScrollPane().repaint();
    }
}

我想重新绘制 scrollPanel 以刷新 label 上的文本显示,这意味着从 Old DataNew Data。但是我没有通过调用

来更改它
((TableFrame) frame).setScrollPane(MyModule.MyScrollPane(data));
((TableFrame) frame).getScrollPane().repaint();

有人可以给我一些建议吗?谢谢你。 我应该怎么做才能达到我的目的?

public void setScrollPane(JScrollPane scrollPane) {
    this.scrollPane = scrollPane;
}

这会将您的 scrollPane 属性设置为给定的 scrollPane。这很好,只是它不再与 JFrame 有任何关系。

一开始,您实际上是将 scrollPane 添加到 JFrame 中。但是您永远不会将其取下并与新的交换。您只需更改您的属性所指的 scrollPane。重新绘制可能很有趣,但不会显示,因为新的 scrollPane 没有添加到 JFrame 中。

编辑: 当您真正想要的只是更改标签文本时,您的编程方式让您的生活变得过于复杂......只需将以下方法添加到您的 TableFrame class:

public void updateLabelText(String newText) {
    label.setText(newText);
    label.repaint();
}

那你就可以打电话

((TableFrame) frame).updateLabelText(data);

来自您的 MouseListener,您甚至根本不需要 MyModule class...

我认为你的主要问题是你不理解引用和实际对象之间的区别。