2017-03-05 72 views
2

我一直試圖在我的代碼中遵循一個MVC模式,並且我正在創建一個系統,在該模型中我有一個JTabbedPane和Jbuttons,這個JTabbedPane在我的View中的面板內,模型中的內容信息,和我的控制器上的actionlisteners。 我一直有的問題是,我一直試圖把一個actionlistener放在我的Jbuttons上,但它似乎只在我的最後一個選項卡上工作(比方說,我有4個選項卡,只有第4個選項卡與jbuttons工作) 哦,我應該說我一直在使用Jbutton陣列 請注意,我一直只使用一個Jbutton陣列放置在我的面板上。 該如何工作?我需要一個示例代碼以供參考。JTabbedPane上的Java MVC模式

這裏是我的樣品View類

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

這裏是我的樣品Controller類

​​
+1

如果不是不可能的話,你的問題將會很難回答,因爲它基本上是:「請猜測爲什麼我沒有顯示你的代碼不工作」。請通過創建一個新的編譯,運行的小程序來改善這個問題,這個程序足夠小,可以在代碼格式的文本中發佈您的問題,並且可以證明您的問題,[mcve]。 –

+0

我很抱歉沒有發佈代碼,因爲我正在創建示例類。我編輯了我的問題併發布了一個示例代碼。 –

+0

感謝您發佈代碼,我會立即查看它,但是一個顯而易見的問題是:else if(input ==「2」)'。不要使用'=='或'!='比較字符串。改爲使用「equals(...)」或「equalsIgnoreCase(...)」方法。理解'=='檢查兩個*對象引用*是否相同,而不是你感興趣的。另一方面,方法檢查兩個字符串是否具有相同順序的相同字符,這就是這裏很重要。 –

回答

1

你重新灌裝的按鈕配置與JTabbedPane中的每個創作,並在這樣做,所有前面的按鈕的引用已從數組中丟棄,只剩下最後一個按鈕。

我建議你爲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:有很多方法可以對它進行編碼。也許「注入」是一個不好的名詞,雖然真正的「依賴注入」la Guice或Spring可能是連接MVC的最好方式,儘管這對你的情況來說是過度殺戮。 –

+0

謝謝!您幫助我瞭解參考資料,同時也感謝您對Strings進行比較的建議。 –