2017-03-05 4 views
2

내 코드에서 MVC 패턴을 따르려고했는데 내 뷰의 패널 안에 Jbutton이있는 JTabbedPane이있는 시스템을 만들고있었습니다. 모델의 내용 정보, 내 컨트롤러에있는 액션 리스너. 내가 겪어 본 문제는 내가 Jbutton에 actionlistener를 넣으려고했지만 마지막 탭에서만 작동하는 것 같다. (4 개의 탭이 있고 jbutton이있는 4 번째 탭만 사용한다고 가정 해 보겠습니다.) 오, 나는 Jbutton 배열을 사용하고 있다고 말해야합니다. 하나의 Jbutton 배열 만 사용하여 패널에 배치했습니다. 어떻게하면 되나요? 참조 용 샘플 코드가 필요합니다. 여기 JTabbedPane의 Java MVC 패턴

내 샘플보기 클래스 여기

import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 

public class View extends JFrame 
{ 
    private static final int HEIGHT = 700; 
    private static final int WIDTH = 700; 

    private JTabbedPane tabPane = new JTabbedPane(); 
    private JComponent tab1 = makePanel("1"); 
    private JComponent tab2 = makePanel("2"); 
    private JComponent tab3 = makePanel("3"); 
    private JComponent tab4 = makePanel("4"); 

    private JButton[] button; 
    private String[] buttonlabel; 

    public View() 
    { 
     setLayout(null); 
     setSize(WIDTH, HEIGHT); 
     setLocationRelativeTo(null); 
     setResizable(false); 
     setVisible(false); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     tabPane.addTab("firstTab", tab1); 
     tabPane.addTab("secondTab", tab2); 
     tabPane.addTab("thirdTab", tab3); 
     tabPane.addTab("fourtTab", tab4); 

     add(tabPane); 

     tabPane.setBounds(20, 20, 400, 400); 
    } 

    protected JComponent makePanel(String input) 
    { 
     JPanel panel = new JPanel(false); 
     panel.setLayout(null); 

     if(input == "1") 
     { 
      button = new JButton[4]; 
      buttonlabel = new String[] 
      { 
       "1button1", 
       "2button1", 
       "3button1", 
       "4button1" 
      }; 

      for(int x = 0; x < 4; x++) 
      { 
       button[x] = new JButton(buttonlabel[x]); 
       panel.add(button[x]); 
      } 

      int yCord = 20; 
      for(int x = 0; x < 4; x += 2) 
      { 
       int xCord = 20; 
       for(int y = x; y < (x + 2); y++) 
       { 
        button[y].setBounds(xCord, yCord, 100, 100); 
        xCord += 120; 
       } 
       yCord += 120; 
      } 
     } 
     else if(input == "2") 
     { 
      button = new JButton[4]; 
      buttonlabel = new String[] 
      { 
       "1button2", 
       "2button2", 
       "3button2", 
       "4button2" 
      }; 

      for(int x = 0; x < 4; x++) 
      { 
       button[x] = new JButton(buttonlabel[x]); 
       panel.add(button[x]); 
      } 

      int yCord = 20; 
      for(int x = 0; x < 4; x += 2) 
      { 
       int xCord = 20; 
       for(int y = x; y < (x + 2) && y < 5; y++) 
       { 
        button[y].setBounds(xCord, yCord, 100, 100); 
        xCord += 120; 
       } 
       yCord += 120; 
      } 
     } 
     else if(input == "3") 
     { 
      button = new JButton[4]; 
      buttonlabel = new String[] 
      { 
       "1button3", 
       "2button3", 
       "3button3", 
       "4button3" 
      }; 

      for(int x = 0; x < 4; x++) 
      { 
       button[x] = new JButton(buttonlabel[x]); 
       panel.add(button[x]); 
      } 

      int yCord = 20; 
      for(int x = 0; x < 4; x += 2) 
      { 
       int xCord = 20; 
       for(int y = x; y < (x + 2) && y < 5; y++) 
       { 
        button[y].setBounds(xCord, yCord, 100, 100); 
        xCord += 120; 
       } 
       yCord += 120; 
      } 
     } 
     else if(input == "4") 
     { 
      button = new JButton[4]; 
      buttonlabel = new String[] 
      { 
       "1button4", 
       "2button4", 
       "3button4", 
       "4button4" 
      }; 

      for(int x = 0; x < 4; x++) 
      { 
       button[x] = new JButton(buttonlabel[x]); 
       panel.add(button[x]); 
      } 

      int yCord = 20; 
      for(int x = 0; x < 4; x += 2) 
      { 
       int xCord = 20; 
       for(int y = x; y < (x + 2) && y < 5; y++) 
       { 
        button[y].setBounds(xCord, yCord, 100, 100); 
        xCord += 120; 
       } 
       yCord += 120; 
      } 
     } 
     return panel; 
    } 

    public void buttonListener(ActionListener buttonL) 
    { 
     for(int x = 0; x < button.length; x++) 
     { 
      button[x].addActionListener(buttonL); 
     } 
    } 

    public static void main(String args[]) 
    { 
     View view = new View(); 

     Controller control = new Controller(view); 
     view.setVisible(true); 
    } 
} 

당신이 그렇게에 JTabbedPane에 각각의 생성과 버튼 배열을 다시 작성하고있는

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Controller 
{ 
    View view = new View(); 

    public Controller(View view) 
    { 
     this.view = view; 

     this.view.buttonListener(new ButtonListener()); 
    } 

    private class ButtonListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      System.out.println("BUTTON WORKS!"); 
     } 
    } 
} 
+1

본질적으로 "귀하에게 보여주지 않는 코드가 왜 작동하지 않는지 추측 해주십시오"라는 이유로 귀하의 질문은 서면으로 답변하는 것이 어렵지 않을지라도 어려울 것입니다. 컴파일하고 실행하며 코드 형식의 텍스트로 질문에 게시 할 수있을만큼 작고 문제점을 나타내는 [mcve] 작은 새 프로그램을 만들어이 기능을 개선하십시오. –

+0

샘플 클래스를 생성하는 중 일찍 코드를 게시하지 않으신 것에 대해 사과드립니다. 내 질문을 편집하고 샘플 코드를 게시했습니다. –

+0

코드를 게시 해 주셔서 감사 드리며 잠시 후에 살펴 보겠습니다. 그러나 즉시 명백한 문제가 있습니다 : 'else if (input == "2")'. '=='또는'! ='를 사용하여 문자열을 비교하지 마십시오. 대신 'equals (...)'또는 'equalsIgnoreCase (...)'메소드를 사용하십시오. 이해 '=='두 * 객체 참조 *가 당신이 관심이없는 것과 같은지 확인합니다. 다른 방법은 두 문자열이 같은 순서로 같은 문자를 가지고 있는지 확인합니다. 여기에 문제가 있습니다. –

답변

1

내 샘플 컨트롤러 클래스입니다 모든 이전 단추에 대한 참조가 배열에서 삭제되고 마지막 단추 만 남아 있습니다.

JTabbedPane의 패널에 대한 클래스를 만들고 컨트롤에서이 클래스를 삽입 할 수 있도록하는 것이 좋습니다. 단순하게 유지하십시오.

일례 :

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

public class View2 extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private static final String[] TAB_NAMES = {"First Tab", "Second Tab", "Third Tab", "Fourth Tab"}; 
    private static final int PREF_W = 400; 
    private static final int PREF_H = 150; 
    private JTabbedPane tabbedPane = new JTabbedPane(); 
    private List<MyTab> myTabs = new ArrayList<>(); 
    private Controller2 controller2; 

    public View2() { 
     setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); 
     setLayout(new BorderLayout()); 
     add(tabbedPane, BorderLayout.CENTER); 

     for (int i = 0; i < TAB_NAMES.length; i++) { 
      int tabNumber = i + 1; 
      MyTab myTab = new MyTab(TAB_NAMES[i], tabNumber); 
      tabbedPane.add(myTab.getTabName(), myTab); 
      myTabs.add(myTab); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension superSz = super.getPreferredSize(); 
     if (isPreferredSizeSet()) { 
      return superSz; 
     } 
     int prefW = Math.max(superSz.width, PREF_W); 
     int prefH = Math.max(superSz.height, PREF_H); 
     return new Dimension(prefW, prefH); 
    } 

    public Controller2 getController2() { 
     return controller2; 
    } 

    public void setController2(Controller2 controller2) { 
     this.controller2 = controller2; 
     for (MyTab myTab : myTabs) { 
      myTab.setController2(controller2); 
     } 
    } 

    private static void createAndShowGui() { 
     View2 viewPanel = new View2(); 
     new Controller2(viewPanel); 

     JFrame frame = new JFrame("View2"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(viewPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

} 

class MyTab extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private static final int BUTTON_COUNT = 4; 
    private String tabName; 
    private int tabNumber; 
    private List<JButton> buttons = new ArrayList<>(); 
    private Controller2 controller2; 

    public MyTab(String tabName, int tabNumber) { 
     this.tabName = tabName; 
     this.tabNumber = tabNumber; 

     setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); 
     setLayout(new GridLayout(2, 2, 4, 4)); 
     for (int i = 0; i < BUTTON_COUNT; i++) { 
      String title = (i + 1) + " Button " + tabNumber; 
      JButton button = new JButton(title); 
      button.addActionListener(e -> { 
       if (controller2 != null) { 
        controller2.buttonAction(e); 
       } 
      }); 
      add(button); 
      buttons.add(button); 
     } 
    } 

    public void setController2(Controller2 controller2) { 
     this.controller2 = controller2; 
    } 

    public String getTabName() { 
     return tabName; 
    } 

    public int getTabNumber() { 
     return tabNumber; 
    } 

    public List<JButton> getButtons() { 
     return buttons; 
    } 

} 

class Controller2 { 

    private View2 view; 

    public Controller2(View2 view) { 
     this.view = view; 
     view.setController2(this); 
    } 

    public void buttonAction(ActionEvent e) { 
     System.out.println("Button pressed! " + e.getActionCommand()); 
    } 

    public View2 getView() { 
     return view; 
    } 

} 

이 예에서는 컨트롤러 메소드를 호출 보아 단순한 익명 내부 클래스 ActionListener를 이용한다.

+0

당신이 말한 것처럼 실제로 버려진다고 생각했지만 컨트롤에 주입하는 방법에 익숙하지 않습니다. MVC 패턴 만 시작 했으므로 코드를 작성하는 방법에 익숙하지 않습니다. –

+0

@ChrisTumanda : 코드를 작성하는 방법은 다양합니다. 아마도 "주사"는 잘못된 용어이지만, "의존성 주입"라 Guice 또는 Spring이 MVC를 연결하는 최선의 방법 일지 모르지만 상황에 따라 과장되는 경우도 있습니다. –

+0

고마워요! 참고 자료를 제공하는 데 나에게 많은 도움을 주셨습니다. 또한 문자열 비교에 대한 조언에 감사드립니다. –