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

时间:2016-07-25 09:42:20

标签: java swing awt

当我处理我的项目时遇到问题,我很困惑。 以下代码是抽象版本。顺便说一句,我很伤心,但我必须以这种方式处理~~

主要条目和框架

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();

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

1 个答案:

答案 0 :(得分:0)

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

这会将scrollPane属性设置为给定的scrollPane。这很好,除了它与JFrame无关。

一开始,您实际上是将您的scrollPane添加到JFrame中。但你永远不会删除它并与新的交换它。您只需更改属性引用的scrollPane。重绘可能很有趣,但不会显示,因为新的scrollPane没有添加到JFrame中。

编辑: 当你真正想要的就是更改标签文本时,你的生活方式太复杂了你编程的方式......只需将以下方法添加到你的TableFrame类中:

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

然后你可以打电话

((TableFrame) frame).updateLabelText(data);
从你的MouseListener

你甚至根本不需要MyModule类......

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