2016-07-25 6 views
0

Я озадачен, когда сталкиваюсь с проблемой при обработке моего проекта. Следующий код представляет собой абстрактную версию. Кстати, мне грустно, но я должен обрабатывать таким образом ~~Метод обновления данных в графическом интерфейсе и параметре доставки

Главный вход и рамы

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

Self-дизайн модуля

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

Listener

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
public void setScrollPane(JScrollPane scrollPane) { 
    this.scrollPane = scrollPane; 
} 

Это приведет к тому, что ваш атрибут scrollPane будет присвоен данному scrollPane. Это здорово, если только это не имеет никакого отношения к JFrame.

В начале вы фактически добавляете свой scrollPane в свой JFrame. Но вы никогда не удаляете его и не обмениваете его новым. Вы просто изменяете значение scrollPane, на которое ссылается ваш атрибут. Перекрашивать это может быть интересно, но не показывается, потому что эта новая scrollPane не была добавлена ​​в JFrame для начала.

Edit: Вы делаете свою жизнь слишком сложна тем, как вы запрограммировали его, когда все, что вы действительно хотите изменить из текста метки ... просто добавьте следующий метод к классу TableFrame:

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

Тогда вы можете просто позвонить

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

от вашего MouseListener и вам даже не нужен класс MyModule вообще ...

Я думаю, что ваша главная проблема заключается в том, что вы не понимаете разницы между ссылками и фактическим объектом.

+0

Спасибо, Что мне следует сделать для достижения моей цели? – RyougiShiki

+0

У меня возникают технические проблемы прямо сейчас, но я сейчас обновляю свой ответ, дайте мне мгновение: D – Mark

+0

Спасибо, ваш anwser. То, как вы показываете, является работоспособным, но я передаю проект, нуждающийся в большом объеме модуля самоопределения. Этот экземпляр является простым, я упрощаю проблему в моем проекте. Мне нужно использовать модуль самоопределения. Сделать это как предварительное условие, есть ли другой способ его решения? В моем проекте я хотел бы предоставить ResultSet. – RyougiShiki