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());
    }
}