0

setVisible(true) メソッドを使用して JFrame とそれに含まれるウィジェットを表示する前に、特定のコンソール入力を待機する JFrame サブクラスがあります。ウィジェット (JPanels のサブクラス) は、イテレーターを使用して LinkedList から親 JFrame に追加され、クラス内の別のメソッドを介して LinkedList に追加されます。

プログラムを実行すると、this.setVisible(true) を含むメソッドが繰り返され、何も表示されません。どんな助けでも大歓迎です。以下にコードを貼り付けました。

public class GUI extends JFrame{

class KPanel extends JPanel{        //virtual class for Panels that displayed variable name in titled border 
    public KPanel(String varName){
        TitledBorder varTitle = new TitledBorder(varName +":");
        this.setBorder(varTitle);       
    }
}

private LinkedList<KPanel> buffer; //list containing components to be added to GUI

public GUI(String title){
    setTitle(title);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setSize(300,300);       
    buffer = new LinkedList<KPanel>(); //initializes linkedlist buffer
}

public void addBox(String var, String val){

//creates a panel containing a string, adds it to the buffer

    KPanel temp = new KPanel(var);
    JLabel valLabel = new JLabel(val);
    temp.add(valLabel);
    buffer.add(temp);
}



public void show(){

    int i=0; 
    int wid_height;
    int x = 0;
    if ((x = buffer.size()) != 0)
        wid_height = this.getHeight()/x; //calculates widget heights for even distribution along frame
    else{
        System.out.println("No variables set!");
        return;
    }
    System.out.println("buffer: " + buffer.size() + "\nheights: " + wid_height);


    Iterator<KPanel>  iter = buffer.iterator();
    KPanel temp = new KPanel("");

    while(iter.hasNext()){
        temp = iter.next();
        temp.setSize(this.getWidth(), wid_height);
        temp.setLocation(0, wid_height*i);
        this.add(temp);
        i++;
    }

    this.setVisible(true);
    return;
}
}
4

2 に答える 2

3

問題は、メソッドが のメソッドshow()をオーバーライドしていることです。につながるのは、それが呼び出しているということです。このメソッドは から継承されており、単純です。 コードは次のとおりです。show()JFrameStackOverflowErrorsetVisible(true)Component

public void setVisible(boolean b) {
    show(b);
}

そしてshow(b)呼び出しますshow()

public void show(boolean b) {
    if (b) {
        show();
    } else {
        hide();
    }
}

したがって、あなたのをshow呼び出すsetVisible、あなたの を呼び出すshow、サイクルを壊すものは何もありません。showこの無限ループを防ぐために、メソッドに別の名前を使用します。

于 2013-11-12T22:10:31.577 に答える