2012-03-16 14 views
0

SwingにUiをビルドして、私の要件はJTable内にJPanesを持つことです。これらのJPanesには、JButtonが組み込まれています。
私の使用例は以下の通りです:
提供されたファイル内にメソッドを格納するUIを提供するMethodEditorを記述しています。 UIでは、ボタンをクリックしたときにメソッドに渡されるパラメータを編集することもできます。
次のように一つ一つの方法は、UI表現を持っているでしょう - enter image description hereJava Swing - JTableをJTableに埋め込んだJpanel

を次のようにメソッドのクラスの私の基本的な表現である -

public Class Method { 

String methodName; 
List<String> InputVariableNames; 
String OutputVariableName; 
} 

今私はMethodオブジェクトのリストを持って、上List<Method> methodListを私は私のJTableをベースにしたい。

public class MethodModel { 
    List<Method> methodModel; 
} 

私は質問earlierを求めていたとあって答えに私のコードをベースとしている - 次のように このListMethodModelクラスに含まれています。
しかし、私のコードは動作していないようです。次のように私のコードがある -

public class MethodEditor extends JTable { 


    private static final long serialVersionUID = 1L; 

    private MethodEditorModel model ; 
    private MethodCellRenderer cellRenderer; 

    public MethodEditor(MethodModel bean) { 
     setRowHeight(25); 
     this.setPreferredSize(new Dimension(500, 500)); 
     model = new MethodEditorModel(bean); 
     this.setModel(model); 
     setupComponent(); 
    } 

    private void setupComponent() { 
     cellRenderer = new MethodCellRenderer(); 
     this.setDefaultRenderer(Object.class,cellRenderer); 
     this.setBorder(BorderFactory.createLineBorder(Color.GRAY)); 
    } 


    private static class MethodEditorModel extends DefaultTableModel implements PropertyChangeListener { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L;  
     private MethodModel bean; 

     public MethodEditorModel(MethodModel bean) { 
      this.bean = bean; 
      bean.addPropertyChangeListener(this); 
     } 


     @Override 
     public void propertyChange(PropertyChangeEvent evt) { 
      fireTableDataChanged(); 

     } 

    } 

    private static class MethodCellRenderer implements TableCellRenderer { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 
     private MethodEditorCellPanel renderer = new MethodEditorCellPanel(); 


     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      MethodModel methodModel = (MethodModel)value; 
      for(Method method : methodModel.getMethodList()) { 
       renderer.setComponents((Method) method); 
      } 
      return renderer; 
     } 

    } 

    private static class MethodEditorCellPanel extends JPanel implements ActionListener { 

     private static final long serialVersionUID = 1L; 
     private JButton upButton; 
     private JButton downButton; 
     private JButton methodDetailsButton; 
     private Method method; 

     public MethodEditorCellPanel() { 
      upButton = new JButton("Up"); 
      downButton = new JButton("Down"); 
     } 

     public void setComponents(Method method) 
     { 
      this.method = method; 
      methodDetailsButton = new JButton(method.getMethodName()); 

      upButton.addActionListener(this); 
      downButton.addActionListener(this); 
      methodDetailsButton.addActionListener(this); 

      Box verticalBar = Box.createHorizontalBox(); 
      verticalBar.add(upButton); 
      verticalBar.add(Box.createHorizontalStrut(15)); 
      verticalBar.add(methodDetailsButton); 
      verticalBar.add(Box.createHorizontalStrut(15)); 
      verticalBar.add(downButton); 
      add(verticalBar); 
     } 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      if(evt.getSource().equals(downButton)) { 

      } 

      if(evt.getSource().equals(upButton)) { 

      } 

      if(evt.getSource().equals(methodDetailsButton)) { 


      } 
     } 

    } 

} 

コードはコンパイルが、JTableは表示されません。 私が間違っているかもしれないことについての指針は大きな助けになるでしょう。

+0

どのようにコードが機能していないのですか?それはコンパイルされませんか、または期待通りに動作しませんか?もしそうなら、何が間違っているのですか? –

+0

* "私が間違っているかもしれないことを指摘するのは大いに役立つでしょう" * 1)Q&Aサイトへの投稿と質問を忘れる。 –

+0

私はあいまいであることをお詫び申し上げます。コードはコンパイルされますが、JTableは表示されません。 – ping

答えて

1

JTableに別のコンポーネントを含めないでください。複数の他のコンポーネントを持つコンポーネントは許可します。その理由は、JTable がマウスイベントをそのセルに渡さないためです。ですから、JTableの内側のボタンを持っている場合でも、あなたはで、自分でそれらを押す気をつけなければならないだろう。

  • 電池を得ることが
  • にクリックされた正確な座標
  • は、これらの座標を推定取得内部コンポーネント
  • 手動で対応するボタンをクリックしてください。

さらに、ボタンのアニメーションやものは得られません。

コンポーネントをテーブルに配置する必要がある場合は、JPanelとGridLayoutまたはGridBagLayoutを使用してください。

+0

[私のポストを参照してください](http://stackoverflow.com/a/9726701/714968) – mKorbel

+0

素敵な仕事。しかし、それでもテーブルにコンポーネントを追加しているわけではありません。あなたはエディタやレンダラとしてそれらを使用しています。しかし、+1、私はそれが好きだった。 –

+0

私は私の使用のために自分の細胞を編集したくなかった。だから、私はJTableの必要性を無くし、JPanelを進めました。ありがとう – ping