2017-03-04 16 views
0

Java Swing에서 GUI를 구현하려고합니다. (저는 Swing을 처음 접했습니다). 두 패널이 들어있는 부모 패널이 있습니다. 왼쪽 패널과 오른쪽 패널. 왼쪽 패널에는 JComboBox 드롭 다운 메뉴가 있습니다. 오른쪽 패널은 7 개의 카드가있는 CardLayout입니다. 왼쪽 패널에있는 JComboBox의 선택에 따라 오른쪽 패널에 표시된 카드를 변경하고 싶습니다. 3 개의 패널은 모두 별도의 클래스입니다 : LeftPanel.java, RightPanel.java 및 ParentPanel.java. 이 작업을 수행 할 리스너를 배치 할 장소를 찾는 데 어려움을 겪고 있습니다. LeftPanel은 RightPanel의 CardLayout을 볼 수 없으며 ParentPanel은 Child RightPanel의 CardLayout에 액세스 할 수 없습니다. 다른 JPanel의 CardLayout에 액세스하는 방법에 대한 게시물을 보았습니다. 디자인에 결함이 있습니까? 아니면 이것을 달성 할 수 있습니까?한 자식의 동작을 다른 자식의 입력에서 어떻게 트리거 할 것입니까? JPanel (Java Swing)?

수정 지금까지 조언 해 주셔서 감사합니다. 아래는 MCVE입니다. 각 클래스는 자체 (.java) 파일에 있습니다. 프레임 클래스의 모든 것을 퍼팅하는 대신 유지 보수를 쉽게하기 위해서였습니다. 나는 이전에 한 클래스에 모든 것을 가지고 있었지만 잘 작동했지만 2000 + 코드 줄과 20 개 이상의 패널을 가진 하나의 긴 파일이되었습니다.

// Main 메서드 포함하는 클래스 메인 프레임 :

패키지를 tempgui; 공용 클래스 ParentPanel가 JPanel을 확장 {

private JPanel ParentPanel; 
private LeftPanel LP; 
private RightPanel RP; 

public ParentPanel(){ 

    ParentPanel = new JPanel(); 
    LP = new LeftPanel(); 
    RP = new RightPanel(); 

    ParentPanel.setLayout(new GridLayout(1,2)); 

    ParentPanel.add(LP); 
    ParentPanel.add(RP); 

    add(ParentPanel); 
} 

}

// 클래스 LeftPanel : 공공 공용 클래스 메인 프레임 JFrame의 {

JFrame Frame1; 

public static void main(String[] args){ 

    new MainFrame(); 
} 

public MainFrame(){ 

    Frame1 = new JFrame(); 
    Frame1.setDefaultCloseOperation(EXIT_ON_CLOSE); 

    Frame1.getContentPane().add(new ParentPanel(), BorderLayout.CENTER);   

    Frame1.setSize(800, 600); 
    Frame1.setLocationRelativeTo(null); 
    Frame1.pack(); 

    Frame1.setVisible(true); 
} 

}

// 클래스 ParentPanel를 확장 LeftPanel은 JPanel을 확장합니다 {

private JPanel LeftPanel; 
private JComboBox J1; 

public LeftPanel(){ 

    LeftPanel = new JPanel(); 

    String[] Arr = {"RP1","RP2"}; 

    J1 = new JComboBox(Arr); 

    LeftPanel.add(J1); 

    add(LeftPanel); 
} 

}

클래스 RightPanel가 //

: 공용 클래스 RightPanel가 JPanel을 확장 {

private JPanel RightPanel; 
private RP1Panel RP1; 
private RP2Panel RP2; 
private CardLayout C1; 

public RightPanel(){ 

    RightPanel = new JPanel(); 
    RP1 = new RP1Panel(); 
    RP2 = new RP2Panel(); 

    C1 = new CardLayout(); 

    RightPanel.setLayout(C1); 

    RightPanel.add(RP1, "RP1"); 
    RightPanel.add(RP2, "RP2"); 
    C1.show(RightPanel, "RP1"); 

    add(RightPanel); 
} 

가}

// 클래스 RP1Panel가 : 공용 클래스 RP1Panel가 {

private JPanel RP1; 
private JLabel JRP1; 

public RP1Panel(){ 

    RP1 = new JPanel(); 
    JRP1 = new JLabel("RP1 Panel"); 
    RP1.add(JRP1); 
    add(RP1); 
} 
JPanel의 확장

}

// 클래스 RP2Panel는 : 공용 클래스 RP2Panel는

+2

' "아니면 가능한 이것을 달성하는 것입니다? "- 네, 가장 확실합니다. ''디자인에 결함이 있습니까? '- 적절한 코드가 없으면, 유효한 mcve가 있어야합니다. 문제가 어디에 있는지 말할 수는 없습니다. 다시 한 번, 작은 형식의 프로그램 인 MCVE를 작성하여 게시하여 코드 형식의 텍스트로 질문에 게시 할 수있을만큼 작고 컴파일하고 실행하며 문제를 설명해보십시오. 그것은 당신의 전체 프로그램이 아니며, 모든 기능을 가지고 있지는 않지만, 다시 우리를 위해 실행되며, 우리에게 문제를 보여줍니다. –

+1

* "모든 3 개의 패널은 별도의 클래스입니다."*이 수수께끼에 대한 1 단계는 "구성 요소 클래스를 불필요하게 확장하지 말 것"입니다. 여기서 패널을 확장하는 경우를 설명 할 수 있습니까? –

답변

1
내가 다른 클래스가 " 상태"를 추출 할 수 있도록 내 수업 방법을 제공하기 위해 노력할 것이다

정보를 JPanel의 {

private JPanel RP2; 
private JLabel JRP2; 

public RP2Panel(){ 

    RP2 = new JPanel(); 
    JRP2 = new JLabel("RP2 Panel"); 
    RP2.add(JRP2); 
    add(RP2); 
} 

}를 확장 콤보 상자의 상태와 같은 항목을 가져 와서 다른 클래스에서 해당 항목을 변경시킬 수 있습니다 (예 : 콤보 상자에 리스너를 추가 할 수 있음).예를 들어 :

// Class LeftPanel: 
class LeftPanel extends JPanel { 
    private JPanel leftPanel; 
    private JComboBox<String> comboBox; //!! 

    // !! 
    public LeftPanel(String[] comboTexts) { 
     leftPanel = new JPanel(); 
     comboBox = new JComboBox<>(comboTexts); // !! 
     leftPanel.add(comboBox); 
     add(leftPanel); 
    } 

    // !! 
    public String getComboSelection() { 
     return comboBox.getSelectedItem().toString(); 
    } 

    // !! 
    public void comboAddActionListener(ActionListener listener) { 
     comboBox.addActionListener(listener); 
    } 
} 

그런 다음 다른 클래스 콤보 상자에 대한 변경 사항을 듣고, 필요한 경우 선택을 추출 할 수 있습니다. 오른쪽 패널에는 마찬가지로 표시되는 "카드"JPanel을 변경할 수있는 방법이 있습니다.

// Class RightPanel: 
class RightPanel extends JPanel { 
    private JPanel rightPanel; 
    private RP1Panel rightPanel1; 
    private RP2Panel rightPanel2; 
    private CardLayout cardLayout; 

    public RightPanel() { 
     rightPanel = new JPanel(); 
     rightPanel1 = new RP1Panel(); 
     rightPanel2 = new RP2Panel(); 
     cardLayout = new CardLayout(); 
     rightPanel.setLayout(cardLayout); 
     rightPanel.add(rightPanel1, RP1Panel.NAME); //!! 
     rightPanel.add(rightPanel2, RP2Panel.NAME); // !! 
     cardLayout.show(rightPanel, RP1Panel.NAME); // !! 
     add(rightPanel); 
    } 

    // !! 
    public void showCard(String name) { 
     cardLayout.show(rightPanel, name); 
    } 
} 

그리고 그들은 주에 함께 묶여 수 : 비슷해

// Class ParentPanel: 
class ParentPanel extends JPanel { 
    private JPanel ParentPanel; 
    private LeftPanel leftPanel; 
    private RightPanel rightPanel; 

    public ParentPanel() { 
     ParentPanel = new JPanel(); 
     leftPanel = new LeftPanel(new String[] {RP1Panel.NAME, RP2Panel.NAME}); 
     rightPanel = new RightPanel(); 
     ParentPanel.setLayout(new GridLayout(1, 2)); 
     ParentPanel.add(leftPanel); 
     ParentPanel.add(rightPanel); 
     add(ParentPanel); 

     // !! 
     leftPanel.comboAddActionListener(e -> { 
      String selection = leftPanel.getComboSelection(); 
      rightPanel.showCard(selection); 
     }); 
    } 
} 

전체 MCVE 모습 수 :

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class FooGui { 
    public static void main(String[] args) { 
     new MainFrame(); 
    } 
} 

class MainFrame extends JFrame { 
    JFrame Frame1; 

    public MainFrame() { 
     Frame1 = new JFrame(); 
     Frame1.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     Frame1.getContentPane().add(new ParentPanel(), BorderLayout.CENTER); 
     Frame1.setSize(800, 600); 
     Frame1.setLocationRelativeTo(null); 
     Frame1.pack(); 
     Frame1.setVisible(true); 
    } 
} 

// Class ParentPanel: 
class ParentPanel extends JPanel { 
    private JPanel ParentPanel; 
    private LeftPanel leftPanel; 
    private RightPanel rightPanel; 

    public ParentPanel() { 
     ParentPanel = new JPanel(); 
     leftPanel = new LeftPanel(new String[] {RP1Panel.NAME, RP2Panel.NAME}); 
     rightPanel = new RightPanel(); 
     ParentPanel.setLayout(new GridLayout(1, 2)); 
     ParentPanel.add(leftPanel); 
     ParentPanel.add(rightPanel); 
     add(ParentPanel); 

     // !! 
     leftPanel.comboAddActionListener(e -> { 
      String selection = leftPanel.getComboSelection(); 
      rightPanel.showCard(selection); 
     }); 
    } 
} 

// Class LeftPanel: 
class LeftPanel extends JPanel { 
    private JPanel leftPanel; 
    private JComboBox<String> comboBox; //!! 

    // !! 
    public LeftPanel(String[] comboTexts) { 
     leftPanel = new JPanel(); 
     comboBox = new JComboBox<>(comboTexts); // !! 
     leftPanel.add(comboBox); 
     add(leftPanel); 
    } 

    // !! 
    public String getComboSelection() { 
     return comboBox.getSelectedItem().toString(); 
    } 

    // !! 
    public void comboAddActionListener(ActionListener listener) { 
     comboBox.addActionListener(listener); 
    } 
} 

// Class RightPanel: 
class RightPanel extends JPanel { 
    private JPanel rightPanel; 
    private RP1Panel rightPanel1; 
    private RP2Panel rightPanel2; 
    private CardLayout cardLayout; 

    public RightPanel() { 
     rightPanel = new JPanel(); 
     rightPanel1 = new RP1Panel(); 
     rightPanel2 = new RP2Panel(); 
     cardLayout = new CardLayout(); 
     rightPanel.setLayout(cardLayout); 
     rightPanel.add(rightPanel1, RP1Panel.NAME); //!! 
     rightPanel.add(rightPanel2, RP2Panel.NAME); // !! 
     cardLayout.show(rightPanel, RP1Panel.NAME); // !! 
     add(rightPanel); 
    } 

    // !! 
    public void showCard(String name) { 
     cardLayout.show(rightPanel, name); 
    } 
} 

// Class RP1Panel: 
class RP1Panel extends JPanel { 
    // !! 
    public static final String NAME = "right panel 1"; 
    private JPanel RP1; 
    private JLabel JRP1; 

    public RP1Panel() { 
     setName(NAME); 
     RP1 = new JPanel(); 
     JRP1 = new JLabel("RP1 Panel"); 
     RP1.add(JRP1); 
     add(RP1); 
    } 
} 

// Class RP2Panel: 
class RP2Panel extends JPanel { 
    // !! 
    public static final String NAME = "right panel 2"; 
    private JPanel RP2; 
    private JLabel JRP2; 

    public RP2Panel() { 
     setName(NAME); 
     RP2 = new JPanel(); 
     JRP2 = new JLabel("RP2 Panel"); 
     RP2.add(JRP2); 
     add(RP2); 
    } 
} 
+0

많은 고마워! 내 사건에 완벽하게 작동했습니다. 비슷한 방법을 사용하여 다른 JPanel의 카드간에 앞뒤로 뒤집기를 제어하는 ​​한 JPanel의 [뒤로], [다음] 단추를 구현할 수 있습니다. 마법사 대화 상자를 만드는 것과 비슷합니다. – nmokc