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();
            }
        });
    }
}
4

1 に答える 1

3

必ず呼び出しrevalidate()て、repaint()コンポーネントを削除した後、displayPanelすなわち:

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

また、次の点にも注意してください。

printBst(0, 800, 0);

結果として、内部の無効な(境界内ではない)座標displayPanelが生成されます。このサイズは(400、300)として定義されます。ウィンドウの左上隅は0,0です。次のことを試してください。パネルの中央のどこかにラベルが表示されます。

printBst(0, 400, 0);

Absolute positioning can be very difficult to manage. Check out A Visual Guide to Layout Managers and see if you can find an appropriate layout to help you.

You may also consider ready to go frameworks that can give you 2D canvas to work on. For example JGraph, JFreeChart or Piccolo2D.

于 2012-04-30T04:25:00.177 に答える