java - 用于帧间按钮按下的 InternalFrameListener?

标签 java swing jbutton

我需要框架来更新并显示按钮被按下的次数(要更新的按钮文本) 如果我可以使用 actionPreformed() 锁定特定事件(按下按钮或按下菜单项),那么我认为这应该有所帮助...

问题:

  • 按下按钮时会创建更多帧

  • 现有框架不会更新(无论如何我只希望有一个框架)

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class ButtonFrame implements InternalFrameListener, ActionListener
    {
    
    JFrame myFrame = null;
    private int clicked;
    final String F=("Clicked: "+clicked+" Times!");
    
    public static void main(String[] a) 
    {
        (new ButtonFrame()).test();
    
    }
    
    private void test() 
    {
        myFrame = new JFrame("Internal Frame with a Button");
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.setSize(400,400);
        myFrame.setContentPane(new JDesktopPane());
        JMenuBar Start_Bar = new JMenuBar();
        JMenu Start_Menu = new JMenu("Frame");
        JMenuItem Start_Item = new JMenuItem("Start");
        Start_Item.addActionListener(this);
        Start_Menu.add(Start_Item);
        Start_Bar.add(Start_Menu);
        myFrame.setJMenuBar(Start_Bar);
        myFrame.setVisible(true);
    
    }
    
    public void actionPerformed(ActionEvent Start_Item) 
    {
        JInternalFrame f = new JInternalFrame("Button Frame");
        f.setResizable(true);
        f.setClosable(false);
        f.setMaximizable(true);
        f.setIconifiable(true);
        f.setSize(200,200);
        f.setLocation(100,100);
        f.addInternalFrameListener(this);
        f.setVisible(true);
    
        Button objButton1;
        objButton1=new Button ("Clicked: "+clicked+" Times!");
        objButton1.setBounds(20,90,40,50);
        f.add(objButton1);
        objButton1.addActionListener(this);
    
        myFrame.getContentPane().add(f);
    }
    
    public void actionPreformed(ActionEvent objButton1)
    {
        clicked++;
    }
    
    public void internalFrameActivated(InternalFrameEvent e) 
    {
        System.out.println("Internal Button Ready");
    }
    public void internalFrameClosed(InternalFrameEvent e) 
    {
        System.out.println("Internal frame closed");
    }
    public void internalFrameClosing(InternalFrameEvent e) 
    {
        System.out.println("Internal frame closing");
    }
    public void internalFrameDeactivated(InternalFrameEvent e) 
    {
        System.out.println("Internal frame deactivated");
    }
    public void internalFrameDeiconified(InternalFrameEvent e) 
    { 
        System.out.println("Internal frame deiconified");
    }
    public void internalFrameIconified(InternalFrameEvent e) 
    {
        System.out.println("Internal frame iconified");
    }
    public void internalFrameOpened(InternalFrameEvent e) 
    {
        System.out.println("Internal frame opened");
    }
    }
    

最佳答案

根据您的描述,您的解决方案是尖叫隔离和代码责任分离,负责管理按钮的代码应该与管理框架和桌面 Pane 的代码分开

这样,您就可以使用单独的 ActionListener 并将功能隔离到按钮类的单个实例

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JDesktopPane dp = new JDesktopPane();

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JMenuBar Start_Bar = new JMenuBar();
                JMenu Start_Menu = new JMenu("Frame");
                JMenuItem Start_Item = new JMenuItem("Start");
                Start_Item.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JInternalFrame f = new JInternalFrame("Button", true, true, true, true);
                        f.setSize(200, 200);
                        f.setLocation(100, 100);
                        f.add(new ButtonPane());
                        f.setVisible(true);
                        dp.add(f);
                    }
                });
                Start_Menu.add(Start_Item);
                Start_Bar.add(Start_Menu);
                frame.setJMenuBar(Start_Bar);

                frame.add(dp);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ButtonPane extends JPanel {

        private JButton button;
        private int count = 0;

        public ButtonPane() {
            setLayout(new GridBagLayout());
            button = new JButton("0");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    count++;
                    button.setText(Integer.toString(count));
                }
            });
            add(button);
        }

    }

}

关于java - 用于帧间按钮按下的 InternalFrameListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075222/

相关文章:

java - 使用 Java 的 Net 库时如何伪造特定的浏览器客户端?

新 AmazonS3Client 上的 java.lang.NoClassDefFoundError

java - 防止在井字游戏中多次单击同一按钮

java - jframe 父级中的 Jpanel 火灾事件

java - 我们可以从 java 调用 python 方法吗?

java - 在 JAVAFX 中设置工具提示的自定义持续时间

java - 解析异常 MaskFormatter

java - 从面板获取图形返回 null

java - 如何从 GridBagLayout 列出 JComponent?

Java JFrame 不更新按钮的设置