配置したコントロールを操作するのに、別のクラスからアクセスさせています。
http://d.hatena.ne.jp/Gakuen/20090105
この様な感じです。(Javaのコードをダイアリーの載せました)
FormOperateクラスに引数としてjLabel1を渡しています。
そして、HatenaTestクラスがFormOperateクラスのインスタンスを作成し、staticなjLabelにsetTextしています。
この方法はかなり強引なやり方だと思うのですが、こんな方法でもいいものでしょうか。
もっと最適な方法があれば教えてください。
まず紹介されているコードは動きませんし,方向性も余りよろしくないのではないかと。元のコードの意図が良く分からないので外しているかも知れませんが,データを保持するモデルを用意してやって,データ更新時にフォーム側へ通知が届く様にしてやるのが良いのではないでしょうか。
import java.util.Observable; import java.util.Observer; public class Hatena extends javax.swing.JFrame implements Observer { LabelModel model; HatenaTest delegate; private void setModel(LabelModel newModel) { this.model = newModel; } private LabelModel getModel() { return this.model; } private void setDelegate(HatenaTest newDelegate) { this.delegate = newDelegate; } private HatenaTest getDelegate() { return this.delegate; } /** Creates new form Hatena */ public Hatena() { initComponents(); setModel(new LabelModel()); getModel().addObserver(this); setDelegate(new HatenaTest(getModel())); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setText("こんにちは"); jButton1.setText("PUSH"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(103, 103, 103) .addComponent(jLabel1)) .addGroup(layout.createSequentialGroup() .addGap(95, 95, 95) .addComponent(jButton1))) .addContainerGap(108, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(59, 59, 59) .addComponent(jLabel1) .addGap(51, 51, 51) .addComponent(jButton1) .addContainerGap(59, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { getDelegate().run(); } public void update(Observable o, Object arg) { jLabel1.setText(((LabelModel)o).getText()); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Hatena().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; // End of variables declaration } class LabelModel extends Observable { private String text; public synchronized void setText(String newText) { if (!newText.equals(this.text)) { this.text = newText; setChanged(); notifyObservers(); } } public String getText() { return this.text; } } class HatenaTest { LabelModel model; private void setModel(LabelModel newModel) { this.model = newModel; } private LabelModel getModel() { return this.model; } public HatenaTest(LabelModel model) { setModel(model); } public void run() { model.setText("Hello"); } }
ありがとうございました。