Java 组合框 returns -1/null
Java ComboBox returns -1/null
我在我的程序中使用了一个组合框(示例如下),它有多种选择。
如果我想读出 ComboBox,它 returns -1 用于索引,"null" 用于项目。
其他人是否遇到了这个问题并且可以帮助我?
提前致谢!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class TestBox extends JFrame {
// start attributes
private JComboBox jComboBox1 = new JComboBox();
private DefaultComboBoxModel jComboBox1Model = new DefaultComboBoxModel();
// end attributes
public TestBox(String title) {
// frame-initialization
super(title);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 300;
int frameHeight = 300;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);
// start components
String[] list = {"1", "2", "3"};
jComboBox1.setModel(jComboBox1Model);
JComboBox jComboBox1 = new JComboBox(list);
jComboBox1.setBounds(24, 40, 150, 20);
jComboBox1.addItemListener(new ItemHandler());
add(jComboBox1);
// end components
setVisible(true);
} // end of public TestBox
// start methods
private class ItemHandler implements ItemListener{
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println("Changed Index to: " + jComboBox1.getSelectedIndex());
}
}
// end methods
public static void main(String[] args) {
new TestBox("TestBox");
} // end of main
} // end of class TestBox
您通过在构造函数中重新声明 来隐藏 jComboBox1 变量。这意味着 class 中的变量与显示的对象不同。
这里:
public TestBox(String title) {
super(title);
// ....
JComboBox jComboBox1 = new JComboBox(list); // *****
// ...
}
解决方法:不要重新声明变量!
public class Foo {
private JTextField bar;
public Foo() {
JTextField bar = new JTextField(10); // re-declaring bar here
}
}
做:
public class Foo {
private JTextField bar;
public Foo() {
bar = new JTextField(10); // ** see the difference? **
}
}
还有
虽然您的直觉可能是使用 null
布局并在您的组件上调用 setBounds(...)
以绝对定位放置它们,但我建议您不要这样做导致非常不灵活的 GUI,虽然它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,而且很难更新和维护。相反,您将想要研究和学习布局管理器,然后嵌套 JPanel,每个 JPanel 都使用自己的布局管理器来创建令人愉悦且复杂的 GUI,这些 GUI 在所有 OS 上看起来都不错。
我在我的程序中使用了一个组合框(示例如下),它有多种选择。 如果我想读出 ComboBox,它 returns -1 用于索引,"null" 用于项目。 其他人是否遇到了这个问题并且可以帮助我?
提前致谢!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class TestBox extends JFrame {
// start attributes
private JComboBox jComboBox1 = new JComboBox();
private DefaultComboBoxModel jComboBox1Model = new DefaultComboBoxModel();
// end attributes
public TestBox(String title) {
// frame-initialization
super(title);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 300;
int frameHeight = 300;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);
// start components
String[] list = {"1", "2", "3"};
jComboBox1.setModel(jComboBox1Model);
JComboBox jComboBox1 = new JComboBox(list);
jComboBox1.setBounds(24, 40, 150, 20);
jComboBox1.addItemListener(new ItemHandler());
add(jComboBox1);
// end components
setVisible(true);
} // end of public TestBox
// start methods
private class ItemHandler implements ItemListener{
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println("Changed Index to: " + jComboBox1.getSelectedIndex());
}
}
// end methods
public static void main(String[] args) {
new TestBox("TestBox");
} // end of main
} // end of class TestBox
您通过在构造函数中重新声明 来隐藏 jComboBox1 变量。这意味着 class 中的变量与显示的对象不同。
这里:
public TestBox(String title) {
super(title);
// ....
JComboBox jComboBox1 = new JComboBox(list); // *****
// ...
}
解决方法:不要重新声明变量!
public class Foo {
private JTextField bar;
public Foo() {
JTextField bar = new JTextField(10); // re-declaring bar here
}
}
做:
public class Foo {
private JTextField bar;
public Foo() {
bar = new JTextField(10); // ** see the difference? **
}
}
还有
虽然您的直觉可能是使用 null
布局并在您的组件上调用 setBounds(...)
以绝对定位放置它们,但我建议您不要这样做导致非常不灵活的 GUI,虽然它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,而且很难更新和维护。相反,您将想要研究和学习布局管理器,然后嵌套 JPanel,每个 JPanel 都使用自己的布局管理器来创建令人愉悦且复杂的 GUI,这些 GUI 在所有 OS 上看起来都不错。