2016-09-24 74 views
0

正在嘗試一個按鈕從其他類添加到JFrame中,但它不工作如何一個JButton從其他類添加到JFrame中

public class ShowMain { 


public static void main(String[] args) throws Throwable { 


    //My JFrame 
    JFrame frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setSize(600, 400); 
    frame.setLayout(null); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setBackground(Color.GRAY); 
} 

我的其他類

public class Commands { 

public static void main(String[] args) throws Throwable { 
    //JButtons 
    JButton button1 = new JButton(); 
    button1.setText(""); 
    button1.setBounds(120, 350, 400, 20); 
    button1.setVisible(true); 
} 

frame.add( button1)無法正常工作

回答

2

您已將所有代碼都放在兩個靜態主要方法中,這意味着兩個類完全無法互動。我建議你創建真正的符合OOP的類,帶有實例字段(「state」),實例方法(「behavior」),並且如果你想改變它的狀態,你有一個類調用另一個類的方法。例如,如果Commands類要添加一個JButton,那麼給你的ShowMain類一個這樣的方法:public void addCommandButton(JButton button)。在說了這些之後,如果這是我的代碼,而不是這樣做,而是會遵循更多的MVC或「模型 - 視圖 - 控制器」程序結構,其中一組類將表示程序邏輯,另一個用戶交互(聽衆)和第三組用於GUI或「視圖」的類。

例如,運行該代碼,顯示如何類連接沒有他們知道關於其它類(鬆耦合):

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class ShowMain { 
    private static void createAndShowGui() { 
     MainPanel mainPanel = new MainPanel(); 
     JScrollPane scrollPane = new JScrollPane(mainPanel); 
     CreateActionPanel actionPanel = new CreateActionPanel(); 
     new Controller(actionPanel, mainPanel); 

     JFrame frame = new JFrame("ShowMain"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(actionPanel, BorderLayout.PAGE_START); 
     frame.add(scrollPane, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

class MainPanel extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = 80; 

    @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 MainPanel() { 
     setBorder(BorderFactory.createTitledBorder("Main Panel")); 
    } 

    public void addButtonAction(Action action) { 
     add(new JButton(action)); 

     // so the button will be displayed properly 
     revalidate(); 
     repaint(); 
    } 
} 

class Controller { 
    public Controller(final CreateActionPanel actionPanel, final MainPanel mainPanel) { 
     actionPanel.addPropertyChangeListener(CreateActionPanel.ACTION_NAME, pcEvt -> { 
      mainPanel.addButtonAction(new AbstractAction((String) pcEvt.getNewValue()) { 
       { 
        int mnemonic = (int) pcEvt.getNewValue().toString().charAt(0); 
        putValue(MNEMONIC_KEY, mnemonic); 
       } 

       @Override 
       public void actionPerformed(ActionEvent evt) { 
        System.out.printf("Button %s pressed!%n", evt.getActionCommand()); 
       } 
      }); 
     }); 
    } 
} 

class CreateActionPanel extends JPanel { 
    public static final String ACTION_NAME = "action name"; 
    private JTextField actionNameField = new JTextField(10); 

    public CreateActionPanel() { 
     actionNameField.addActionListener((e -> { 
      String text = actionNameField.getText(); 
      firePropertyChange(ACTION_NAME, null, text); 
      actionNameField.selectAll(); 
     })); 

     add(new JLabel("Button Text to Add:")); 
     add(actionNameField); 
    } 
} 
相關問題