2017-10-08 16 views
0

JPanel에서 값을 가져 오는 GUI를 만들려고합니다. 버튼을 누르면 이전 패널에서 입력 한 정보를 사용하는 다음 패널로 이동합니다. 한 패널은 사용자가 이전 패널에서 입력 한 값에 따라 달라 지므로 CardLayout은 패널을 문자열로 참조하므로 여기서는 작동하지 않을 것이라고 생각합니다. 내가 구현하기 위해 노력하고있어 메커니즘의 예로서 입력에 따라 JPanel을 변경할 JFrame을 작성합니다. JPanel 자체는 상황에 따라 다르고 변수에 따라 달라집니다.

, 나는

  1. 가 첫 번째 패널 입력에 번호를 사용자에게 묻습니다 JFrame,
  2. 두 번째 패널을 만드는 시도 그러면 사용자가 선택한 첫 번째 번호를 표시하고 두 번째 번호를 선택하도록 요청합니다.
  3. 세 번째 패널에는 사용자가 선택한 첫 번째 번호와 두 번째 번호가 모두 표시되어 세 번째 번호를 요청합니다.
  4. 마지막으로 네 번째 패널은 사용자가 각 JPanel에 입력 한 세 개의 숫자의 합계를 표시하고 사용자가 JFrame을 다시 설정할 수 있도록합니다.

내가 처음부터 끝까지 이동할 수있는 4 개의 별도 클래스를 만들었습니다. JPanels. 코드에서 알 수 있듯이 나는이 각각의 JPanel을 별도의 JFrame에 테스트하여 원하는 효과가 발생하는지 확인했습니다.

다음은 PanelThree, PanelFour 및 전체 GUI 코드입니다.

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

이제이 문제는, 시도 클래스가 네 JPanel 니트에게 :

패널 세 :

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

패널 네 개의 패널 하나, 둘, 패널 3 매우 유사 마지막으로 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

"model-view-controller"패러다임을 연구해야합니다. 아이디어는보기 및 컨트롤러에서 공유 할 수있는 데이터를 나타내는 "모델"입니다.보기 및 컨트롤러의 이벤트를 기반으로 발생해야 할 작업을 결정합니다. – MadProgrammer

답변

0

나는 그것이 문자열

왜으로 패널을 참조로 CardLayout 여기에 작동합니다 생각하지 않는다?

일련의 이벤트가 있습니다.

  1. 숫자를 입력

    ,
  2. 디스플레이 다른 패널.

입력 된 첫 번째 숫자에 두 번째 패널에서 액세스 할 수있는 이유가 없습니다. CardLayout과는 아무런 관련이 없습니다.

두 번째 패널에는 첫 번째 패널에서 데이터에 액세스하는 방법 만 있으면됩니다. 따라서 두 번째 패널을 만들면 첫 번째 패널에 대한 참조를 전달할 수 있습니다. 따라서 두 번째 패널을 표시하면 첫 번째 패널에 입력 된 번호에 액세스 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 몇 가지 코드로이 작업을 수행하는 방법에 대한 간단한 예를 들어 주시겠습니까? – JenniferHL3