是一个实现下拉列表功能的,照着例子打,跟例子一样啊,但是我的没法运行,例子那个可以。估计哪被我打错了,找不到!拜托了import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;public class ListDemo extends JPanel implements ListSelectionListener
{

private DefaultListModel listModel;

private JList list;

    private static final String hireString = "添加";
    private static final String fireString = "删除";
    private JButton fireButton; 
    private JTextField employeeName;

public ListDemo()
{

super(new BorderLayout());

listModel = new DefaultListModel();
listModel.addElement("Alan Sommerer");
listModel.addElement("Alison Huml");
listModel.addElement("Kathy Walrath");
listModel.addElement("Lisa Friendly");
listModel.addElement("Mary Campione");
listModel.addElement("Sharon Zakhour");

list = new JList(listModel);

list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

list.setSelectedIndex(0);

list.addListSelectionListener(this);

list.setVisibleRowCount(5);

JScrollPane listScrollPane = new JScrollPane(list);

JButton hireButton = new JButton(hireString);

HireListener hireListener = new HireListener(hireButton);

hireButton.setActionCommand(hireString);

hireButton.addActionListener(hireListener);
//禁用按钮
hireButton.setEnabled(false);

JButton fireButton = new JButton(fireString);
fireButton.setActionCommand(fireString);

fireButton.addActionListener(new FireListener());

JTextField employeeName = new JTextField(10);

employeeName.addActionListener(hireListener);

employeeName.getDocument().addDocumentListener(hireListener);

String name = listModel.getElementAt(list.getSelectedIndex()).toString();
//创建一个面板
JPanel buttonPane = new JPanel();

buttonPane.setLayout(new BoxLayout(buttonPane,BoxLayout.LINE_AXIS));

buttonPane.add(fireButton);

buttonPane.add(Box.createHorizontalStrut(5));

buttonPane.add(new JSeparator(SwingConstants.VERTICAL));
buttonPane.add(Box.createHorizontalStrut(5));
buttonPane.add(employeeName);
buttonPane.add(hireButton);
buttonPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); add(listScrollPane,BorderLayout.CENTER);
add(buttonPane,BorderLayout.PAGE_END);
}

class FireListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
int index = list.getSelectedIndex();
listModel.remove(index);
int size = listModel.getSize();
if(size == 0)
{
fireButton.setEnabled(false);
}else
{
if(index == listModel.getSize())
{
index--;
}
list.setSelectedIndex(index);
list.ensureIndexIsVisible(index);
}
}
}

class HireListener implements ActionListener,DocumentListener
{

private boolean alreadyEnabled = false;

private JButton button;

public HireListener(JButton button)
{
this.button = button;
}
public void actionPerformed(ActionEvent e)
{
String name = employeeName.getText();
if(name.equals("")||alreadyInList(name))
{
Toolkit.getDefaultToolkit().beep();//发出嘟的提示音
employeeName.requestFocusInWindow();

employeeName.selectAll();

return;
}
int index = list.getSelectedIndex();
if(index == -1)
{
index = 0;
}else
{
index++;
}
listModel.insertElementAt(employeeName.getText(),index);

employeeName.requestFocusInWindow();
employeeName.setText("");

list.setSelectedIndex(index);
list.ensureIndexIsVisible(index);
}

protected boolean alreadyInList(String name)
{
return  listModel.contains(name);
}

public void insertUpdate(DocumentEvent e)
{
enableButton();
}
public void removeUpdate(DocumentEvent e)
{
handleEmptyTextField(e);
}
public void changedUpdate(DocumentEvent e)
{
if(!handleEmptyTextField(e))
{
enableButton();
}
}
private void enableButton()
{
if(!alreadyEnabled)
{
button.setEnabled(true);
}
}
private boolean handleEmptyTextField(DocumentEvent e)
{
if(e.getDocument().getLength() <= 0)
{
button.setEnabled(false);
alreadyEnabled = false;
return true;
}
return false;
}

}
public void valueChanged(ListSelectionEvent e)
{
if(e.getValueIsAdjusting() == false)
{
if(list.getSelectedIndex() == -1)
{
fireButton.setEnabled(false);
}else
{
fireButton.setEnabled(true);
}
}
}
public static void main(String []args)
{
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JComponent newContentPane = new ListDemo();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);

frame.pack();
frame.setVisible(true);
}

}

解决方案 »

  1.   

    你那个fireButton都没有初始化啊。
      

  2.   

    晕死,这么多错啊
    NullPointerException at ListDemo.valueChanged(ListDemo.java:191)
    ...
      

  3.   

    // 禁用按钮
    hireButton.setEnabled(false);

    //JButton fireButton = new JButton(fireString);                fireButton = new JButton(fireString);//应该是这样
    fireButton.setActionCommand(fireString);

    fireButton.addActionListener(new FireListener());
      

  4.   

    兄弟啊~~你乱了啊
    private JButton fireButton;声明过了,那么为何你构造函数中还有
    JButton fireButton = new JButton(fireString);
    这样的语句?构造函书中的声明屏蔽了外面的声明,构造函书中所使用的是内部声明过的,你向面板添加的也是这个。可是,到了监听器中的actionPerformed方法中,你所使用的不是构造函数中所声明的这个,而是那个全局变量。而它显然是一个未被初始化得对象,其指向为null。故此抛出java.lang.NullPointerException异常。解决的方法很简单,构造函书中
    JButton fireButton = new JButton(fireString);
    改为
     fireButton = new JButton(fireString);还有其他的一些,也类似。还有这个
    JTextField employeeName = new JTextField(10);
    同样道理。
    加油吧,细心一些,你能够避免许多错误!!
      

  5.   

    ....
           ....
           // 禁用按钮
            hireButton.setEnabled(false);
            
           //JButton fireButton = new JButton(fireString);       fireButton = new JButton(fireString);//应该是这样       fireButton.setActionCommand(fireString);
            
           fireButton.addActionListener(new FireListener());
           ....
      

  6.   

    你把 JButton fireButton = new JButton(fireString);改成
    fireButton = new JButton(fireString);把TextField employeeName = new JTextField(10);改成
    employeeName = new JTextField(10);应该就可以了。
      

  7.   

    感谢啊,我终于找到错误了!java刚接触不久,让大家见笑了。我会努力的!