主要条目和框架
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 Data
到New Data
。但是我没有通过调用
((TableFrame) frame).setScrollPane(MyModule.MyScrollPane(data));
((TableFrame) frame).getScrollPane().repaint();
有人可以给我一些建议吗?谢谢。 我该怎么做才能达到目的?
答案 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类......
我认为你的主要问题是你不理解引用和实际对象之间的区别。