JList根据单击的数量将文本放入特定的文本字段中

时间:2013-12-20 15:18:11

标签: java swing onclick jpanel jlist

我正在创建一个音板应用程序,其中该人将要点击我的JList中的一个项目,并将其设置为下一个可用文本字段的名称,因为刚刚点击了我将要添加的内容按钮以后。

例如,如果我的第一个单击是JList中的第二个项目,它将进入第一个JTextfield,我的第二个单击将进入第二个JTextfield。

在应用程序完成时,程序将在JList中拥有大约100个项目。

还有一个问题是,当单击顶部和不同的JList项目时,顶部的项目将首先显示。如果我可以让问题完全正常运行,但不一定会出现问题,但这会让人觉得有点不稳定。

 package com.leagueoflegends.soundboard;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import java.awt.*;

public class Soundboard implements ListSelectionListener {

static JList<Object> list;
String[] text = { "hello", "testing1", "testing2" };
Icon icon;
JLabel pictureLabel;
JPanel insidePanel;
JTextField inlineText;

JTextField field[] = new JTextField[6];

public Soundboard() {
JFrame f = new JFrame("soundboard!");

JPanel masterPanel = new JPanel(new BorderLayout());

//icon = new ImageIcon(getClass().getResource("Tray.png"));
//pictureLabel = new JLabel(icon);

list = new JList<Object>(text); // data has type Object[]
list.setSelectionModel(new DefaultListSelectionModel(){
    public void setSelectionInterval(int index0, int index1){
        if(super.isSelectedIndex(index0)){
            super.removeSelectionInterval(index0,index1);
        }else{
            super.addSelectionInterval(index0,index1);
        }
    }
});
list.setLayoutOrientation(JList.VERTICAL_WRAP);
list.setVisibleRowCount(-1);
list.addListSelectionListener(this);

JScrollPane listScroller = new JScrollPane(list);
listScroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
listScroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
listScroller.setPreferredSize(new Dimension(100, 60));
// listScroller.setSize(new Dimension(250, 60));

JPanel smallPanel = new JPanel(new GridLayout(2, 3));
// smallPanel.setBorder(BorderFactory.createLineBorder(Color.red));
for (int i = 0; i <= 5; i++) {
    insidePanel = new JPanel(new BorderLayout());
    insidePanel.setBorder(BorderFactory.createLineBorder(Color.black));
    field[i] = new JTextField();
    field[i].setEditable(false);
    field[i].setHorizontalAlignment(JTextField.CENTER);
    insidePanel.add(field[i], BorderLayout.PAGE_START);
    smallPanel.add(insidePanel);

}

masterPanel.add(smallPanel);
masterPanel.add(pictureLabel, BorderLayout.PAGE_START);
masterPanel.add(listScroller, BorderLayout.WEST);
f.add(masterPanel);

f.pack();
f.setSize(1000, 800);
f.setMinimumSize(new Dimension(400, 350));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}

public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting() == false) {
    for (int i = 0; i < text.length; i++) {
        if (list.getSelectedIndex() == i) {
            field[0].setText(text[i]);
        }
    }
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException |     IllegalAccessException
                | UnsupportedLookAndFeelException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        new Soundboard();
    }
});
}

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题是正确的,那么你必须在列表中提供自定义列表模型。您可以使用此自定义列表模型初始化JList。

列表模型的条目包含对的引用 适当的文本字段实例。所以每次你选择列表的条目你 可以访问您的自定义列表项,您可以操作相关文本字段的文本。

自定义列表模型必须实现ListModel接口或扩展AbstractListModel类。

有很多很好的教程可以看一下:

摇摆/ UsingaCustomDataModel.htm“&GT; HTTP://www.java2s.com/Tutorial/Java/0240_Swing/UsingaCustomDataModel.htm

希望它有所帮助。