2017-10-08 4 views
0

JPanelの値をとるGUIを作成しようとしています。前のパネルから入力された情報を使用する次のパネルに移動します。 1つのパネルはユーザーが前のパネルから入力した値に依存するため、CardLayoutはパネルを文字列として参照するのでここでは機能しません。私が実装しようとしている機構の一例として、私は最初のパネルが多数、 JPanel自体がコンテキストに依存し、変数に依存する入力に基づいてJPanelを変更するJFrameを記述する

  • 第二パネルの入力をユーザーに求めます

    1. JFrameを作成するために

      を試みてきました

    2. 3番目のパネルには、ユーザーが選択した最初の番号と2番目の番号の両方が表示され、3番目の番号が尋ねられます。
    3. 最後に、4番目のパネルには、ユーザーが各JPanelに入力した3つの数字の合計が表示され、ユーザーはJFrameをリセットできます。

    最初に4つの別々のクラスを作成して、4つのクラスを作成して、移動できるようにしたいと思っています。JPanelsコードからわかるように、これらのそれぞれを別のJFrameにテストして、目的の効果が得られるかどうかを確認しました。

    PanelThreePanelFourおよび全体のGUIのコードは次のとおりです。パネル1と2はパネル3と非常によく似ています

    パネル3:

    import javax.swing.*; 
    import java.awt.*; 
    
    public class PanelThree extends JPanel { 
        JPanel row1 = new JPanel(); 
        JPanel row2 = new JPanel(); 
        JPanel row3 = new JPanel(); 
        JSlider slider = new JSlider(0, 10, 5); 
        JButton next = new JButton("Find the total of all three numbers"); 
    
    public PanelThree(int num0, int num1) { 
        BorderLayout lay = new BorderLayout(); 
        setLayout(lay); 
    
        JLabel one = new JLabel("Choose your last number on the slider, the 
        slider goes from one to ten. Your first number was: " + num0 + ". Your 
        second number was: " + num1); 
        row1.add(one); 
        row2.add(slider); 
        row3.add(next); 
    
        add(row1, BorderLayout.NORTH); 
        add(row2, BorderLayout.CENTER); 
        add(row3, BorderLayout.SOUTH); 
    } 
    
    public static void main(String[] args) { 
        JFrame frame = new JFrame(); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setSize(800,600); 
        PanelThree panelThree = new PanelThree(7, 2); 
        frame.setContentPane(panelThree); 
        frame.setVisible(true); 
        } 
    } 
    

    パネル4:

    import javax.swing.*; 
    import java.awt.*; 
    
    public class PanelFour extends JPanel { 
        JPanel row1 = new JPanel(); 
        JPanel row2 = new JPanel(); 
        JButton reset = new JButton("Reset"); 
    
    public PanelFour(int num0, int num1, int num2) { 
        BorderLayout lay = new BorderLayout(); 
        setLayout(lay); 
    
        int tot = num0 + num1 + num2; 
        JLabel total = new JLabel("All of your numbers add up to: " + tot); 
        row1.add(total); 
        row2.add(reset); 
    
        add(row1, BorderLayout.CENTER); 
        add(row2, BorderLayout.SOUTH); 
    } 
    
    public static void main(String[] args) { 
        JFrame frame = new JFrame(); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setSize(800,600); 
        PanelFour panelFour = new PanelFour(7, 2, 9); 
        frame.setContentPane(panelFour); 
        frame.setVisible(true); 
        } 
    } 
    

    さて、これは、4 JPanelを編むしようとするクラスの問題です最後にJPanelに入力されたものに基づいて反応するようにしてください。JFrame。この問題は、Frameコンストラクタ内のコンポーネントにアクセスできないactionPerformedメソッドを使用しているようです。ここでは、コードは次のようになります。

    import javax.swing.*; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    
    public class Frame extends JFrame implements ActionListener { 
        int x, y, z; 
    
    public void Frame() { 
        super("Number Adder"); 
        int i = 1; 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    
        PanelOne panelOne = new PanelOne(); 
        panelOne.next.addActionListener(this); 
    
        PanelTwo panelTwo = new PanelTwo(x); 
        panelTwo.next.addActionListener(this); 
    
        PanelThree panelThree = new PanelThree(x, y); 
        panelThree.next.addActionListener(this); 
    
        PanelFour panelFour = new PanelFour(x, y, z); 
        panelFour.reset.addActionListener(this); 
    
        if (i == 1) { 
         add(panelOne); 
        } else if (i == 2) { 
         add(panelTwo); 
        } else if (i == 3) { 
         add(panelThree); 
        } else { 
         add(panelFour); 
        } 
    } 
    
    public actionPerformed(ActionEvent e) { 
        if (e.getSource() == panelOne.next) { 
         return x = int panelOne.slider.getValue(); 
         return i = 2; 
        } else if (e.getSource() == panelTwo.next) { 
         return y = int panelTwo.slider.getValue(); 
         return i = 3; 
        } else if (e.getSource() == panelThree.next) { 
         return z = int panelThree.slider.getValue(); 
         return i = 4; 
        } else { 
         return i = 1; 
        } 
        repaint(); 
    } 
    
    public static void main(String[] args) { 
        Frame frame = new Frame(); 
        } 
    } 
    

    が、私はこれをこれを修正または改善するために何ができますか?

  • +1

    ようこそスタックオーバーフロー!あなたはあなたの質問に多くのコードを書いているので、私たち(そして将来の読者)にはどこに問題があるのか​​がはっきりしません。問題のコードを10行以下に減らしてください。参照:[最小限で完全で検証可能な例の作成方法](http://stackoverflow.com/help/mcve)と[小規模プログラムのデバッグ方法](https://ericlippert.com/2014/03/05)/how-to-debug-small-programs /)を実行します。 –

    +0

    @JoeC 10行では設計上問題はありません。動作上の問題ではないので、デバッグは役に立ちません。 – user1803551

    +0

    「モデルビューコントローラ」のパラダイムについていくつかの研究を行う必要があります。ビューとモデルのイベントに基づいて何が起こるべきかを決定するビューとコントローラによって共有できるデータを表す「モデル」があります。 – MadProgrammer

    答えて

    0

    私はそれは、文字列

    なぜないようパネルをいうCardLayoutはここで働いてますとは思いませんか?

    一連のイベントがあります。

    1. 、番号を​​入力して別のパネルを表示します。

    第2パネルが最初に入力した番号にアクセスできない理由はありません。それはCardLayoutとは関係ありません。

    2番目のパネルでは、最初のパネルからデータにアクセスするだけで済みます。だから、2番目のパネルを作成するときに、最初のパネルへの参照を渡します。したがって、2番目のパネルを表示すると、最初のパネルに入力された番号にアクセスできます。

    +0

    ご返信ありがとうございます。いくつかのコードでこれを行う方法の小さな例を教えてください。 – JenniferHL3

    関連する問題