簡體   English   中英

如何從其他類向JFrame添加JButton

[英]How to add a JButton to JFrame from other class

我正在嘗試從其他類向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)不起作用

您已將所有代碼包含在兩個靜態main方法中,這意味着這兩個類幾乎無法交互。 我建議您使用實例字段(“狀態”),實例方法(“行為”)創建真正的OOP兼容類,並且如果您想更改其狀態,則可以讓一個類調用另一個方法。 例如,如果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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM