2016-09-24 42 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); 
    } 
} 
相关问题