2016-09-24 4 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

У вас есть весь код в двух статических основных методах, что означает, что два класса вряд ли могут взаимодействовать вообще. Я предлагаю вам создавать истинные классы, совместимые с ООП, с полями экземпляра («состояние»), методами экземпляра («поведение») и что один класс вызывает метод другого, если вы хотите изменить его состояние. Например, если класс Commands должен добавить JButton, тогда дайте вашему классу ShowMain метод для этого: public void addCommandButton(JButton button).

Сказав это, я бы не сделал этого вообще, если бы это был мой код, а скорее следовал бы за более сложной структурой MVC или «Model-View-Controller», где один набор классов представлял бы логику программы , другое пользовательское взаимодействие (слушатели) и 3-й набор классов для графического интерфейса пользователя или «вид».

Например, запустить этот код, который показывает, как соединить классы без них зная о другом классе (слабосвязанности):

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); 
    } 
} 
Смежные вопросы