首页 > 解决方案 > How get data from JFrame Component Java?

问题描述

I need get some data from "Board" Component but i dont know how. I tried Frame.Component.data but is doesn't work. Code:

public class window extends JFrame {
public  window() {

   add(new Board());

    setResizable(true);
    pack();
    setTitle("Game");
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
public static void main(String[] args) {


    EventQueue.invokeLater(() -> {
        JFrame ex = new window();
        ex.setVisible(true);
        ex.addWindowListener(new java.awt.event.WindowAdapter() {

            public void windowClosing(java.awt.event.WindowEvent windowEvent) {
                //ex.Board.data
                System.exit(0);
            }
        });
    });
}}

标签: javaswingjframe

解决方案


首先是一个快速回答的小技巧:减少您的代码以重现您的错误更容易理解,特别是在您的真正目的是在评论中的情况下......然后使其可编译......

要回答您的问题:我个人使用专用字段来直接链接到我稍后要处理的对象有两个原因首先一个字段易于使用并且不使用大量内存。其次,此解决方案将不取决于您的框架的组织方式。获得相同结果的另一种方法是第二个片段,问题是如果您更改框架组织,您将不得不修改您的侦听器

package so1;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Window extends JFrame {

    private static final long serialVersionUID = 3000003489937872937L;

    public class Data {
        public void doSomethings() {
            System.out.println("toto");
        }
    }

    public class Board extends JLabel {

        private static final long serialVersionUID = 7362684018638848838L;
        private Data data = new Data();

    }

    private Board board;

    public Window() {
        board = new Board();
        add(board);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }

    public static void main(String[] args) {
        Window ex = new Window();
        ex.setVisible(true);
        ex.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent windowEvent) {
                ex.board.data.doSomethings();
            }
        });
    }
}

不好的解决方案:

public static void main(String[] args) {
        Window ex = new Window();
        ex.setVisible(true);
        ex.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent windowEvent) {
                ((Board)((JPanel)((JLayeredPane)((JRootPane)ex.getComponents()[0]).getComponents()[1]).getComponents()[0]).getComponents()[0]).data.doSomethings();;
            }
        });
    }

推荐阅读