[英]Java Get Selected Combobox from Another Class
新手在这里。 首先,很抱歉,如果这篇文章不遵守stackoverflow的规则。 我想从这个来源询问3年前的同一个问题(我认为答案有误): stackoverflow源
如何从一个类中获取ComboBox的选定项目,以及如何在新类中使用该选定项目的值。
假设是源类和其他类。 我想从其他类的源类中打印项目3(ComboBox中的第三项)。
我已经使用了以上来源的答案。 但是,它仅返回第一项。 因为我认为每次我从源类调用构造函数时,它都会将选定的项重新启动到第一项。
当我使用javax.swing.JFrame(我使用Netbeans)时该怎么做?
public class Source extends javax.swing.JFrame{
final JComboBox test = new JComboBox();
test.setModel(new DefaultComboBoxModel(new String[] {"Item 1", "Item 2", "Item 3"}));
...
public String getSelectedItem() {
return (String) test.getSelectedItem();
}
另一类:
public class Other extends javax.swing.JFrame{
public Other(){
Source sc = new Source();
String var = sc.getSelectedItem();
System.out.println(var);
}
}
假设我在Source类中选择了Item 3。 那么它将在其他班级获得第3项吗? 还是我做错构造函数? 抱歉给你带来不便。
我想问3年前的同一个问题(答案有误)...
不,这个答案是完全正确的。
如何从一个类中获取ComboBox的选定项目,以及如何在新类中使用该选定项目的值。
同样,Reimeus会告诉您如何正确进行操作。
假设是源类和其他类。 我想从其他类的源类中打印项目3(ComboBox中的第三项)。
不知道"item 3"
是什么意思,但是如果它是另一个选择的项目,那么您所指的答案也是正确的 。
我已经使用了以上来源的答案。 但是,它仅返回第一项。 因为我认为每次我从源类调用构造函数时,它都会将选定的项重新启动到第一项。
这正是您的问题-您不应该重新调用构造函数,因为这会给您错误的引用。 它将为您提供一个全新的GUI参考,一个未显示的 GUI参考。 您需要参考当前查看的兴趣类别。 如何执行此操作将取决于程序的结构-请显示更多内容。
例如:请注意,以下代码具有两个JButton,一个JButton在其ActionListener中正确地执行操作(实际上是AbstractAction,但具有相似的构造),而另一个错误地执行操作:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class GetCombo extends JFrame {
// the displayed ClassWithCombo object
private ClassWithCombo classWithCombo = new ClassWithCombo(this);;
private int columns = 10;
private JTextField textField1 = new JTextField(columns);
private JTextField textField2 = new JTextField(columns);
public GetCombo() {
classWithCombo.pack();
classWithCombo.setLocationByPlatform(true);
classWithCombo.setVisible(true);
setLayout(new FlowLayout());
add(textField1);
add(new JButton(new AbstractAction("Doing It Right") {
@Override
public void actionPerformed(ActionEvent e) {
// use the ClassWithCombo reference that is already displayed
String selectedString = classWithCombo.getSelectedItem();
textField1.setText(selectedString);
}
}));
add(textField2);
add(new JButton(new AbstractAction("Doing It Wrong") {
@Override
public void actionPerformed(ActionEvent e) {
// create a new non-displayed ClassWithCombo reference.
ClassWithCombo classWithCombo = new ClassWithCombo(GetCombo.this);
String selectedString = classWithCombo.getSelectedItem();
textField2.setText(selectedString);
}
}));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
GetCombo getCombo = new GetCombo();
getCombo.setTitle("Get Combo Example");
getCombo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getCombo.pack();
getCombo.setLocationRelativeTo(null);
getCombo.setVisible(true);
});
}
}
@SuppressWarnings("serial")
class ClassWithCombo extends JDialog {
private static final String[] DATA = { "Mon", "Tues", "Wed", "Thurs", "Fri" };
private JComboBox<String> combo = new JComboBox<>(DATA);
public ClassWithCombo(JFrame frame) {
super(frame, "Holds Combo Dialog", ModalityType.MODELESS);
setLayout(new FlowLayout());
setPreferredSize(new Dimension(300, 250));
add(combo);
}
public String getSelectedItem() {
return (String) combo.getSelectedItem();
}
}
编辑
阅读您的最新文章后,我现在看到您正在尝试打开包含该组合的窗口,作为向用户显示的窗口,以获取信息以供主程序在运行时使用。 在这种情况下,最好的选择是使用模式对话框,即在打开对话框后冻结主窗口中程序流的对话框,不允许用户在打开对话框后与主窗口进行交互,然后在关闭对话框窗口后恢复程序流程和用户交互。
请在下面查看对我的示例程序所做的更改。 在这里,我更改了用于JDialog的超级构造函数,使其具有APPLICATION_MODAL,具有上述行为。 然后在主窗口的按钮的ActionListener中打开对话框。 由于组合窗口是一个模式对话框-程序直到关闭后才从组合窗口中提取信息-此位非常重要。 这样,您的主程序就可以得到用户的选择,而不总是获得组合框中的第一项。 我添加了一个名为SubmitButton的新JButton,它所做的只是关闭当前窗口。 如果需要,您可以将ActionListener添加到JComboBox中,以便在做出选择后关闭它的窗口,但这不允许用户改变主意,因此我更喜欢使用提交按钮。
请注意,更改用\\\\ !!
标记\\\\ !!
评论。
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class GetCombo2 extends JFrame {
// the displayed ClassWithCombo object
private ClassWithCombo classWithCombo = new ClassWithCombo(this);;
private int columns = 10;
private JTextField textField1 = new JTextField(columns);
public GetCombo2() {
classWithCombo.pack();
classWithCombo.setLocationByPlatform(true);
// !! don't do this here
// classWithCombo.setVisible(true);
setLayout(new FlowLayout());
textField1.setFocusable(false);
add(textField1);
add(new JButton(new AbstractAction("Open Combo as a Dialog") {
@Override
public void actionPerformed(ActionEvent e) {
// open combo dialog as a **modal** dialog:
classWithCombo.setVisible(true);
// this won't run until the dialog has been closed
String selectedString = classWithCombo.getSelectedItem();
textField1.setText(selectedString);
}
}));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
GetCombo2 getCombo = new GetCombo2();
getCombo.setTitle("Get Combo Example");
getCombo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getCombo.pack();
getCombo.setLocationRelativeTo(null);
getCombo.setVisible(true);
});
}
}
@SuppressWarnings("serial")
class ClassWithCombo extends JDialog {
private static final String[] DATA = { "Mon", "Tues", "Wed", "Thurs", "Fri" };
private JComboBox<String> combo = new JComboBox<>(DATA);
public ClassWithCombo(JFrame frame) {
// !! don't make it MODELESS
// !! super(frame, "Holds Combo Dialog", ModalityType.MODELESS);
// !! note the change. Made it APPLICATION_MODAL
super(frame, "Holds Combo Dialog", ModalityType.APPLICATION_MODAL);
JButton submitButton = new JButton(new AbstractAction("Submit") {
// !! add an ActionListener to close window when the submit button
// has been pressed.
@Override
public void actionPerformed(ActionEvent e) {
ClassWithCombo.this.setVisible(false);
}
});
setLayout(new FlowLayout());
setPreferredSize(new Dimension(300, 250));
add(combo);
add(submitButton);
}
public String getSelectedItem() {
return (String) combo.getSelectedItem();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.