2012-04-30 7 views
1

挿入と削除を可能にするBSTツリー用の簡単なGUIを作成しようとしています。しかし、私は実行時にコンポーネントをGUIに挿入する際に多くの問題を抱えています。 私がやったと思ったのは、挿入や削除が起こるたびにGUIを "リフレッシュ"することでした。下記のように番号付きのインデックスを表示するためにJlabelsを作成するprintBstというメソッドを作成しましたが、表示されません。 後でGUIの再検証と検証を試みましたが、それでも動作しません。誰にでもアイデアはありますか?スウィングを使用してランタイム中にオブジェクトを作成して表示する

package source; 
import javax.swing.*; 
import source.BST.BSTnode; 

import java.awt.Color; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.util.ArrayList; 
import java.util.List; 

public class Frame2 extends JFrame implements ActionListener{ 
    BST bst; 
    JPanel displayPanel, buttonPanel, totalGUI; 
    JButton insertButton, deleteButton, resetButton; 
    JTextField insertField, deleteField; 

    public JPanel createContentPane(){ 
     bst = new BST(); 
     totalGUI = new JPanel(); 
     totalGUI.setLayout(null); 

     displayPanel = new JPanel(); 
     displayPanel.setLayout(null); 
     displayPanel.setLocation(10, 80); 
     displayPanel.setSize(400, 300); 
     totalGUI.add(displayPanel); 

     buttonPanel = new JPanel(); 
     buttonPanel.setLayout(null); 
     buttonPanel.setLocation(10, 0); 
     buttonPanel.setSize(800, 80); 
     totalGUI.add(buttonPanel); 

     insertField = new JTextField(1); 
     insertField.addActionListener(this); 
     insertField.setLocation(0, 10); 
     insertField.setSize(150, 30); 
     buttonPanel.add(insertField); 

     insertButton = new JButton("Insert"); 
     insertButton.setLocation(160, 10); 
     insertButton.setSize(150, 30); 
     insertButton.addActionListener(this); 
     buttonPanel.add(insertButton); 

     deleteField = new JTextField(1); 
     deleteField.addActionListener(this); 
     deleteField.setLocation(320, 10); 
     deleteField.setSize(150, 30); 
     buttonPanel.add(deleteField); 

     deleteButton = new JButton("Delete"); 
     deleteButton.setLocation(480, 10); 
     deleteButton.setSize(150, 30); 
     deleteButton.addActionListener(this); 
     buttonPanel.add(deleteButton); 

     resetButton = new JButton("Reset"); 
     resetButton.setLocation(640, 10); 
     resetButton.setSize(150, 30); 
     resetButton.addActionListener(this); 
     buttonPanel.add(resetButton); 

     totalGUI.setOpaque(true); 
     return totalGUI; 
    } 

    public void printBst(BSTnode node, int x, int x2, int y) { 
     if (node != null) { 
      JLabel current = new JLabel(""+ node.data); 
      current.setLocation((x+x2)/2, y); 
      current.setSize(100, 30); 
      current.setHorizontalAlignment(0); 
      displayPanel.add(current); 
      printBst(node.left, x, (x2+x)/2, y+60); 
      printBst(node.right, (x2+x)/2, x2, y+60); 
      System.out.println("here"); 
     } 
    } 

    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == insertButton) 
     { 
      bst.insert(Integer.valueOf(insertField.getText())); 
      displayPanel.removeAll(); 
      printBst(bst.root, 0, 800, 0); 
      totalGUI.revalidate(); 
      validate(); 
     } 
     else if(e.getSource() == deleteButton) 
     { 
      bst.delete(Integer.valueOf(deleteField.getText())); 
      displayPanel.removeAll(); 
      printBst(bst.root, 0, 800, 0); 
      totalGUI.revalidate(); 
      validate(); 
     } 
     else if(e.getSource() == resetButton) 
     { 
      bst.clear(); 
      displayPanel.removeAll(); 
      printBst(bst.root, 0, 800, 0); 
      totalGUI.revalidate(); 
      validate(); 
     } 
    } 

    private static void createAndShowGUI() { 

     JFrame.setDefaultLookAndFeelDecorated(true); 
     JFrame frame = new JFrame("[=] JButton Scores! [=]"); 

     Frame2 demo = new Frame2(); 
     frame.setContentPane(demo.createContentPane()); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(900, 400); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+2

BST - バイナリ検索ツリークラスが存在しないため、このプログラムをテストすることはできません。注目のために働くコード([SSCCE](http://sscce.org/))+1を提供してください: –

答えて

3

あなたはdisplayPanelすなわちからコンポーネントを削除した後、必ずrevalidate()repaint()を呼び出してください:

displayPanel.removeAll(); 
printBst(0, 800, 0); 
displayPanel.revalidate(); 
displayPanel.repaint(); 

また、次の点に注意してください無効(ない範囲で)座標で

printBst(0, 800, 0); 

結果inside displayPanel、サイズは(400,300)と定義されています。ウィンドウの左上隅は0,0です。次のことを試してみて、あなたは、パネルの真ん中のどこかで、あなたのラベルが表示されるはずです。

printBst(0, 400, 0); 

Absolute positioningは管理が非常に困難な場合があります。 A Visual Guide to Layout Managersをチェックして、適切なレイアウトが見つかるかどうかを確認してください。

また、2Dキャンバスを動作させるためのフレームワークも用意されています。例えば、JGraph,JFreeChartまたはPiccolo2D

+1

+1、JGraphへのリンクは有望に見えます:-) –

関連する問題