Java 小程序选项不会在每次更改选项(列表)时调用项状态更改方法为什么?
代码:每次我更改列表浏览器的项(列表项/选项)时,它都会调用Java 小程序选项不会在每次更改选项(列表)时调用项状态更改方法为什么?,java,swing,applet,Java,Swing,Applet,代码:每次我更改列表浏览器的项(列表项/选项)时,它都会调用itemStateChanged()并调用repaint()。但在操作系统列表更改其项的情况下,这是不同的,它不调用itemStateChanged()不知道为什么,但列表器同时附加到这两个项 import java.applet.*; import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.It
itemStateChanged()
并调用repaint()
。但在操作系统列表更改其项的情况下,这是不同的,它不调用itemStateChanged()
不知道为什么,但列表器同时附加到这两个项
import java.applet.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class AppletList extends Applet implements ItemListener {
String msg = "";
Choice browser, os;
public void init() {
setForeground(Color.red);
browser=new Choice();
os=new Choice();
browser.addItem("Explorer");
browser.addItem("Chrome");
browser.addItem("Mozilla");
os.addItem("Windows");
os.addItem("Mac");
add(browser);
add(os);
os.addItemListener(this);
browser.addItemListener(this);
}
@Override
public void itemStateChanged(ItemEvent e) {
repaint();
}
public void paint(Graphics g){
msg="Browser : ";
msg+=browser.getSelectedItem();
g.drawString(msg, 6,120);
msg="OS :+ ";
msg+=os.getSelectedItem();
g.drawString(msg, 6, 140);
}
}
您使用的是哪个版本的Java和操作系统?您的小程序在我的笔记本电脑上运行良好(使用Java 8和Windows 8.1) 按照的(一些)建议切换到Swing并使用
JLabel
s,您可以尝试一下这段代码(我同意使用Swing和常规组件更好,甚至可以解决您机器上的问题):
import java.applet.*;
导入java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.border.*;
公共类AppletListSwing扩展Applet实现ItemListener{
专用JComboBox浏览器ComboBox;
专用JComboBox-osComboBox;
私人JLabel浏览器标签;
私人JLabel-osLabel;
公共void init(){
setLayout(新的BorderLayout());
//创建控制面板。
最终JPanel控制面板=新JPanel();
browserComboBox=newJComboBox(新字符串[]{“Explorer”、“Chrome”、“Mozilla”});
osComboBox=newjcombobox(新字符串[]{“Windows”,“Mac”});
浏览器组合框。设置前景(颜色。红色);
osComboBox.setForeground(颜色:红色);
添加(浏览器组合框);
控制面板。添加(OSCOMBOX);
添加(控制面板,BorderLayout.NORTH);
browserComboBox.addItemListener(此);
addItemListener(此);
//创建显示面板。
最终的JPanel显示面板=新的JPanel();
displayPanel.setboorder(新的清空命令(28,28,28,28));
displayPanel.setLayout(新的BoxLayout(displayPanel,BoxLayout.PAGE_轴));
browserLabel=新的JLabel();
osLabel=新的JLabel();
browserLabel.setForeground(颜色:红色);
osLabel.setForeground(颜色:红色);
displayPanel.add(Box.createRigidArea)(新维度(0,42));
displayPanel.add(浏览器标签);
displayPanel.add(Box.createRigidArea)(新维度(0,6));
displayPanel.add(osLabel);
添加(displayPanel,BorderLayout.CENTER);
updateDisplayPanel();
}
@凌驾
公共无效itemStateChanged(ItemEvent e){
updateDisplayPanel();
}
私有void updateDisplayPanel(){
browserLabel.setText(“浏览器:+browserComboBox.getSelectedItem());
osLabel.setText(“OS:+”+osComboBox.getSelectedItem());
}
}
真的吗?Applet和AWT在15年前被Swing取代。如果您实际使用Swing库,您将发现更好的支持。小程序在最好的时候也是有问题的,最好使用JFrame
作为顶级容器。话虽如此,您应该避免覆盖顶级容器(如Applet
和JFrame
)的paint
,而是使用JPanel
之类的内容,覆盖它的paintComponent
方法,尽管在您的情况下,我建议使用JLabel
s
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class AppletListSwing extends Applet implements ItemListener {
private JComboBox<String> browserComboBox;
private JComboBox<String> osComboBox;
private JLabel browserLabel;
private JLabel osLabel;
public void init() {
setLayout(new BorderLayout());
// Create the control panel.
final JPanel controlPanel = new JPanel();
browserComboBox = new JComboBox<>(new String[]{"Explorer", "Chrome", "Mozilla"});
osComboBox = new JComboBox<>(new String[]{"Windows", "Mac"});
browserComboBox.setForeground(Color.RED);
osComboBox.setForeground(Color.RED);
controlPanel.add(browserComboBox);
controlPanel.add(osComboBox);
add(controlPanel, BorderLayout.NORTH);
browserComboBox.addItemListener(this);
osComboBox.addItemListener(this);
// Create the display panel.
final JPanel displayPanel = new JPanel();
displayPanel.setBorder(new EmptyBorder(28, 28, 28, 28));
displayPanel.setLayout(new BoxLayout(displayPanel, BoxLayout.PAGE_AXIS));
browserLabel = new JLabel();
osLabel = new JLabel();
browserLabel.setForeground(Color.RED);
osLabel.setForeground(Color.RED);
displayPanel.add(Box.createRigidArea(new Dimension(0, 42)));
displayPanel.add(browserLabel);
displayPanel.add(Box.createRigidArea(new Dimension(0, 6)));
displayPanel.add(osLabel);
add(displayPanel, BorderLayout.CENTER);
updateDisplayPanel();
}
@Override
public void itemStateChanged(ItemEvent e) {
updateDisplayPanel();
}
private void updateDisplayPanel() {
browserLabel.setText("Browser : " + browserComboBox.getSelectedItem());
osLabel.setText("OS :+ " + osComboBox.getSelectedItem());
}
}