【问题标题】:Swing - Using jComboBox from another frameSwing - 从另一个框架使用 jComboBox
【发布时间】:2016-03-09 07:31:04
【问题描述】:

我的程序将允许用户在三个表单之间导航。主菜单、客户信息和数据库。

我需要主菜单对象可以与客户表单提交按钮一起使用。例如:

有一些组合框,我想:

String variable = jComboMainMenu1.getSelectedItem().toString;

如何将对象导入客户表单以使用所选值?

编辑:

**我得到的错误是combox是jframe私有的。没有办法改变它,因为netbeans不允许我这样做?

说//变量声明 - 不要修改。

**我试过了:

public String car = jComboBox1.getSelectedItem().toString(); (这会将组合框中的值存储在您已经知道的变量中)。

然而,swing 似乎受到了超级限制,因为即使是我的框架 jbutton 也被限制为私有,这意味着该变量不能公开以与其他框架上的按钮一起使用。

令人沮丧的是,它限制了我程序员更改代码:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

    new CustomerForm().setVisible(true);
    setVisible(false);

    String car = jComboBox1.getSelectedItem().toString();

}                                        


// Variables declaration - do not modify                                                 <-- can't be changed either.
private javax.swing.JButton jButton1;
private javax.swing.JComboBox jComboBox1;
private javax.swing.JComboBox jComboBox2;
private javax.swing.JComboBox jComboBox3;
private javax.swing.JComboBox jComboBox4;
private javax.swing.JComboBox jComboBox5;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JTextField jTextField1;
// End of variables declaration                   

** 我曾尝试在 IDE 本身中编辑模板,但是更改灰色区域的方法似乎被大量封装。

这样的事情应该很简单吧? :P

【问题讨论】:

  • The Use of Multiple JFrames, Good/Bad Practice? 最有可能的是JFrame,而所有其他顶级容器(可能是模态的)JDialog windows。
  • 我仍然会遇到同样的问题。这次在 jframe 中使用 jDialog 对象?还有另一个问题。私人无效jButton2ActionPerformed(java.awt.event.ActionEvent evt){NewJDialogCarRental.setVisible(真);设置可见(假); } 此代码不再适用于 jDialog,就像它对框架所做的那样
  • “我仍然会遇到同样的问题” 这就是为什么我的评论没有得到答案。它没有解决直接的问题。不过,作为解决这个问题的一个小窍门,总的来说,这都是关于 OOP 的。诀窍是保持或获得对相关字段的引用(或者可能只是提供数据的模型)并使用其方法来获取值。不过,在更广泛的设计说明中,最好封装字段本身并通过声明它们的类的方法访问它们的数据。所以说真的,这与 Swing 关系不大,而与 OOP 关系更大。
  • 很遗憾,这是一个这样的问题,对于一个简单的问题没有简单的解决方案。就像将变量声明为公共的一样。像类一样调用表单。但看起来我只需要把所有东西都放在一个我已经知道该怎么做的表格上,只是想获得更多技能。我正在为大学做这个。
  • “这是一个很遗憾的问题,对于一个简单的问题没有简单的解决方案。” 当它出现时,您估计是“简单”一个设计良好的多窗口桌面应用程序。可能是……天真。而是一个评论。 OOP 是程序员应该在简单的命令行应用程序中处理的类型——可能就在“循环和条件结构”的时候。开发 GUI 通常比在命令行应用程序中做同样的事情要困难一个数量级。

标签: java swing oop object jframe


【解决方案1】:

编辑:调整为组合框

如果您想从客户表单访问主表单的组合框,您可以传递对该组合框的引用;例如,当您创建客户表单时。 (将主窗体链接到客户窗体的另一种方法是在主窗体的组合框中添加一个动作侦听器,该侦听器调用客户窗体中的一个方法,该方法将所选项目作为参数传递。)

例如(使用 Java 8):

import java.awt.BorderLayout;
import javax.swing.*;

public class MainMenu {
    private CustomerForm customerForm;

    public static void main(String[] arguments) {
        SwingUtilities.invokeLater(() -> new MainMenu().createAndShowGui());
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame("Stack Overflow");
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel panel = new JPanel(new BorderLayout());
        String[] comboBoxItems = {"one", "two", "three"};
        JComboBox<String> jComboBox1 = new JComboBox<>(comboBoxItems);
        panel.add(jComboBox1, BorderLayout.NORTH);
        JButton button = new JButton("Do it!");
        panel.add(button, BorderLayout.SOUTH);
        frame.getContentPane().add(panel);

        Database database = new Database();
        customerForm = new CustomerForm(database, jComboBox1);

        button.addActionListener(actionEvent -> customerForm.doSomething());

        frame.setVisible(true);
    }
}


class CustomerForm {
    private Database database;
    private JComboBox<String> comboBox;

    public CustomerForm(Database database, JComboBox<String> comboBox) {
        this.database = database;
        this.comboBox = comboBox;
    }

    public void doSomething() {
        System.out.println();
        System.out.println("CustomerForm.doSomething");
        System.out.println("database: " + database);

        System.out.println("comboBox.getSelectedItem().toString(): "
                           + comboBox.getSelectedItem().toString());
    }
}


class Database {
}

【讨论】:

  • 我需要能够在另一个框架提交按钮中使用来自一个框架的组合框输入。你觉得你能详细解释一下我需要做什么,所以请我学习一下?
  • 上面的例子使用单选按钮菜单项而不是组合框,但大体思路是一样的。您可以通过例如将对它的引用传递给另一个对象(如上所示)或通过创建公共 getter 方法来提供对类的私有字段的访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
相关资源
最近更新 更多