java - 如何在不使用静态的情况下将信息从一个类传输到另一个类以显示它?

标签 java swing static

我正在编写一个处理来自数据库的订单的应用程序。它有几个页面、一个导航、一个始终应显示有关您正在处理的实际订单信息的标题和一个内容区域,其中显示所述订单的详细信息:

Layout

我的 MainProgram 扩展了 JFrame并包含一个 CardLayout ,其中托管其他页面,因此当用户单击导航中的页面时,只有内容区域的 View 会发生变化。 Logo 、标题和导航保持不变。标题一直显示订单号。

由于有几个不同的页面包含有关同一订单的详细信息,因此我需要将有关订单的信息从一个页面“发送/传输”到另一个页面,以便我可以在订单对象的标题和内容区域中显示一些信息.

但是我没有让它按预期工作,主要是我对静态和何时使用它的误解,对象是在那里准确创建的,还有我的程序的复杂性:我正在使用一个用于导航的类,因此应该也处理
信息从一页转移到另一页。

由于我使用的是数据库,因此创建了一个 MVCE会很难,所以我将展示我的程序的重要部分。

MainProgram.java

这里创建了导航和内容面板 (centerPanel),还有 CardLayout . centerPanelCardLayout是静态的,所以我可以从其他类调用它并切换显示的页面(可能不是一个好主意?):

NavigationPanel navigationPanel = new NavigationPanel();

public static JPanel centerPanel = new JPanel();
public static CardLayout contentCardsLayout = new CardLayout();

我创建页面并将它们放入我的 CardLayout :
OverviewPage overviewPage = new OverviewPage();
BasicDataPage basicDataPage = new BasicDataPage();

centerPanel.setLayout(contentCardsLayout);

overviewPage.setName("overviewPage");
basicDataPage.setName("basicDataPage");

centerPanel.add(overviewPage, "overviewPage");
centerPanel.add(basicDataPage, "basicDataPage");

在 main 方法中,我创建了一个 MainProgram 对象:
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                MainProgram window = new MainProgram();
                window.setVisible(true);
                window.initialize();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

概览Page.java

概览页面包含 JTable它从数据库中填充。如果用户双击一个条目,他将被转移到 BasicDataPage在那里他可以看到订单的详细信息。

但是为了显示细节,我需要以某种方式将订单对象的信息传输到目标类中,这就是我正在努力解决的问题!
// I tried several things like object into constructor, static object, creating a method etc...
if (mouseEvent.getClickCount() == 2 && row != -1) {
    String workNumberOfOrderObject = (String) table.getValueAt(row, 0);
    OrderObject orderObject = GetOrderObject.getOrderObjectFromDatabase(workNumberOfOrderObject);
    BasicDataPage basicDataPage = new BasicDataPage();
    basicDataPage.recieveOrderObject(orderObject);
    workNumberPanel.recieveOrderObject(orderObject);
    workNumberPanel.setTxtWorkNumber(workNumberOfOrderObject);
    MainProgram.contentCardsLayout.show(MainProgram.centerPanel, "basicDataPage");
}

我尝试将订单对象“发送”到 BasicDataPage通过构造函数并在 JTextFields 中设置文本在 BasicDataPage因此。这不起作用,文本字段只是保持空白,尽管我可以 System.out.println(orderObject.toString())收到的对象。

BasicDataPage.java

我也尝试创建一个方法 receiveOrderObject我在 OverviewPage 中使用的,它应该设置 basicDataPage 的文本字段和 workNumberPanel ,但字段保持为空:
WorkNumberPanel workNumberPanel = new WorkNumberPanel();

JTextField txtCarWidth = new JTextField(TEXTFIELD_LENGTH);
JTextField txtCarDepth = new JTextField(TEXTFIELD_LENGTH);
JTextField txtCarHeight = new JTextField(TEXTFIELD_LENGTH);

public void recieveOrderObject(OrderObject orderObject){
    txtCarDepth.setText(orderObject.getCar_depth());
}

在发布我的问题之前,我已经在 SO 上阅读了几个 Q/As,如下所示:

Accessing UUID from another class in Java ...建议对全局变量使用静态。

我知道静态变量是类变量,所有实例都可以使用,并且只存在一个版本。所以我试图将一个静态对象从一个类发送到另一个类。

但由于我使用的是 JTextFields , 我不得不混合静态和非静态内容,要么根本不起作用,要么 textfields disappeared .

我有一种感觉,我在 java 中得到了一个非常基本的概念,所以无论在哪个方向,任何帮助都值得赞赏!

编辑:

基于 Reşit Dönüks回答,我可以通过制作 BasicDataPage 来填充文本字段。和 loadBasicData(orderObject)MainProgram静止的。现在我可以做 MainProgram.loadBasicData(orderObject); ... 以及 BasicDataPage 中的文本字段按预期填满。

这是一种有效的方法还是我在为 GUI 元素使用静态时遇到问题? ..... Don't!

最佳答案

我意识到,您正在创建 BasicDataPage在每次双击中。

if (mouseEvent.getClickCount() == 2 && row != -1) {
    String workNumberOfOrderObject = (String) table.getValueAt(row, 0);
    OrderObject orderObject = GetOrderObject.getOrderObjectFromDatabase(workNumberOfOrderObject);
    BasicDataPage basicDataPage = new BasicDataPage();

这是主要问题。不创建 BasicDataPage在那里,只需到达创建的实例并将订单对象设置为该实例。我的解决方案如下。
public class MainProgram implements OrderView{

    //remove statics here
    private JPanel centerPanel = new JPanel();
    private CardLayout contentCardsLayout = new CardLayout();

    private BasicDataPage basicPage;

    public MainProgram() {
        //other codes
        OverviewPage overviewPage = new OverviewPage();
        basicPage = new BasicDataPage();

        centerPanel.setLayout(contentCardsLayout);

        overviewPage.setName("overviewPage");
        basicDataPage.setName("basicDataPage");

        centerPanel.add(overviewPage, "overviewPage");
        centerPanel.add(basicPage, "basicDataPage");
        //oher codes
    }

    @Override
    public void loadOrder(OrderObject order) {
        basicPage.recieveOrderObject(orderObject);

        contentCardsLayout.show(centerPanel, "basicDataPage");
    }
}

public interface OrderView {

    public void loadOrder(OrderObject order);
}

public class OverviewPage {

    OrderView orderView;

    public OverviewPage(OrderView orderView) {
        this.orderView = orderView;
    }

    //in ActionPerformed
    if (mouseEvent.getClickCount() == 2 && row != -1) {
        String workNumberOfOrderObject = (String) table.getValueAt(row, 0);
        OrderObject orderObject = GetOrderObject.getOrderObjectFromDatabase(workNumberOfOrderObject);
        orderView.loadOrder(orderObject);
        workNumberPanel.recieveOrderObject(orderObject);
        workNumberPanel.setTxtWorkNumber(workNumberOfOrderObject);
    }
}

关于java - 如何在不使用静态的情况下将信息从一个类传输到另一个类以显示它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36408351/

相关文章:

java - 同时启用/禁用不同 JComponent 组

java - 如何更改 JTabbedPane 中选项卡的顺序

java - 制作更新的 JLabel

c# 从静态函数中打印类名

java - 当文本字段中恰好有 13 个字符时触发按钮

Java 在运行时按名称间接访问变量?

java - 使用java获取字符串内特定值的字符串操作

Java swing-在点击时执行一个 Action

php - 为什么 PHP 5.2+ 不允许抽象静态类方法?

c++ - 引用微分函数