記録として、これは主に私の個人的な意見です (これはより意見の質問であるため)。
通常、Swing アプリケーションでは、コードをモデル/ビュー/コントロール (MVC) に分離するのが最善です。これは、実際の Swing コンポーネントが Viow であり、リスナーが Control であり、実際に処理を行うコードが Model であることを意味します。この場合、View と Model の両方が Control のみを認識します (Control は View と Model の両方を認識します)。
したがって、モデルが更新されると、コントロールに通知され、ビューが更新されます。ビューでも同じです(ビューのリスナーが実行し、モデルを更新するコントロールに通知します)。
これの利点は、ビューとモデルを疎結合することです (ビューはユーザーに何かを表示することだけを気にし、モデルはデータだけを気にします。正しい情報を入手してください)。
以下に例を示します (簡単にするために、それらはすべて 1 つのファイルに含まれていますが、通常は、少なくとも MVC をそれぞれ独自のファイルに格納します)。
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class MVCSeparation {
// Model: (Number crunching math-y) or (data processing) stuff
public static class Model{
ArrayList<String> data = new ArrayList<String>();
public void addData(String value){
data.add(value);
}
public int getCount(){
return data.size();
}
public String randomValue(){
String result = "";
if(data.size() > 0){
int index = (int)(Math.random() * data.size());
System.out.println(index);
result = data.get(index);
}
System.out.println("Getting Value: " + result);
return result;
}
}
// View: Pretty graphics and visuals
public static class View extends Box{
JLabel text = new JLabel("Random Value:");
JTextField newItem = new JTextField(10);
JButton submit = new JButton("Submit");
public View(){
super(BoxLayout.Y_AXIS);
add(text);
add(newItem);
add(submit);
}
public void setSubmitAction(ActionListener submitAction){
submit.addActionListener(submitAction);
}
public void setDisplayText(String value){
text.setText("Random Value: " + value);
}
public String getText(){
String result = newItem.getText();
newItem.setText("");
return result;
}
public void startupApp(){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(this);
frame.validate();
frame.pack();
frame.setVisible(true);
}
}
// Processing User Interactions and Data Updates (links two above together)
public static class Control{
Model m = new Model();
View v = new View();
public Control(){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
v.setSubmitAction(new SubmitText());
v.startupApp();
}});
//Randomly update label
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
v.setDisplayText(m.randomValue());
}});
}
}
// Listener to notify us of user interactions on the View
public class SubmitText implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
m.addData(v.getText());
}
}
}
public static void main(String[] args) {
new Control();
}
}