2016-07-25 42 views
0

zu liefern Ich bin verwirrt, wenn das Problem auftritt, wie ich mein Projekt handhabe. Der folgende Code ist eine abstrakte Version. By the way, ich bin traurig, aber ich habe auf diese Weise behandeln ~~Methode, um Daten in der GUI zu aktualisieren und Parameter

Haupteintrag und Rahmen

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; 
    } 
} 

Selbst Design-Modul

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; 
    } 
} 

Zuhörer

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

Ich möchte die scrollPanel neu streichen, um den Text auf der label, dh von Old Data bis New Data zu aktualisieren. Aber ich habe es versäumt, es zu ändern, indem ich anrufe

((TableFrame) frame).setScrollPane(MyModule.MyScrollPane(data)); 
((TableFrame) frame).getScrollPane().repaint(); 

Kann jemand mir etwas beraten? Vielen Dank. Was soll ich tun, um meinen Zweck zu erreichen?

Antwort

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

Dadurch wird Ihr scrollPane-Attribut auf die angegebene scrollPane festgelegt. Was großartig ist, außer dass es nichts mehr mit dem JFrame zu tun hat.

Am Anfang fügen Sie Ihren scrollPane tatsächlich zu Ihrem JFrame hinzu. Aber Sie entfernen es nie und tauschen es mit dem Neuen aus. Sie ändern nur, auf welchen scrollPane sich Ihr Attribut bezieht. Repainting, das Spaß machen könnte, wird aber nicht angezeigt, da das neue scrollPane nicht zu Beginn mit dem JFrame hinzugefügt wurde.

Edit: Sie machen Ihr Leben viel zu kompliziert mit der Art und Weise Sie es programmiert, wenn alles, was Sie wirklich wollen, ist ein Beschriftungstext ändern out ... fügen Sie einfach die folgende Methode zu Ihrer TableFrame Klasse:

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

Dann können Sie rufen Sie einfach

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

von Ihrem Mouselistener und Sie erhalten die MyModule Klasse gar nicht einmal brauchen ...

Ich denke, Ihr Hauptproblem besteht darin, dass Sie den Unterschied zwischen Referenzen und dem tatsächlichen Objekt nicht verstehen.

+0

Danke, was soll ich tun, um meinen Zweck zu erreichen? – RyougiShiki

+0

Ich habe gerade technische Probleme, aber ich bin dabei, meine Antwort zu aktualisieren, geben Sie mir einen Moment: D – Mark

+0

Danke zuerst anwser. Die Art, wie du zeigst, ist praktikabel, aber ich gebe ein Projekt, das viel selbstdefiniertes Modul benötigt. Diese Instanz ist eine einfache Ich vereinfache das Problem in meinem Projekt. Ich muss ein selbstdefiniertes Modul verwenden. Machen Sie dies als Voraussetzung, gibt es eine andere Methode, um es zu lösen? In meinem Projekt möchte ich ein ResultSet liefern. – RyougiShiki