繁体   English   中英

我的JList没有显示

[英]My JList isn't show

我写了一个程序,但是当我启动他时,我的JList没有显示。 谁能看到有什么不好? https://pastebin.com/CWFnSjen ,它的工作方式如下:在JTextField中,我需要输入一个单词,然后在单击“输入”之后,必须将这个世界添加到JList中

   public static void main(String[] args)
{
    new DrawSwing();
}

public DrawSwing()
{
    SwingUtilities.invokeLater(() -> createGUI());
}

protected void createGUI()
{

    JPanel main = new JPanel();
    main.setLayout(new BorderLayout());
     WlasnyMode<String> model = new WlasnyMode<>();
     MyTextField text = new MyTextField(model);
    MyFrame jf = new MyFrame();
  jf.setTitle("Rysowanie");
  jf.setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE);  
    jf.setLocation(50,50);         jf.setResizable(true);
    JPanel  uper =new JPanel();
    uper.setLayout(new GridLayout(1,1));
    JPanel textPanel = new JPanel();
    jf.setLayout(new BorderLayout());
    textPanel.setLayout(new BorderLayout());

uper.add(text);


    textPanel.setPreferredSize(new Dimension(500,500));
    JList<String> lista = new JList<>(model);
    JScrollPane scroll = new JScrollPane(lista);
    textPanel.add(scroll);
    lista.setCellRenderer(new MyCellRenderer());
    lista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    lista.setLayoutOrientation(JList.VERTICAL);
    lista.setVisibleRowCount(30);
    lista.setBounds(100,100 , 300, 300);
   textPanel.add(lista);
    main.add(uper,BorderLayout.NORTH);
    main.add(textPanel,BorderLayout.CENTER);
 jf.setContentPane(main);  
 jf.pack( ); 
 jf.setVisible(true);   
  }
 }

您的JList看起来很好。 如果我添加lista.setBackground(Color.BLUE); 在您的代码中,可以清楚地看到JList

问题的一部分是您将其包装在另一个JPaneltextPanel )中的事实,通常这会textPanel一堆东​​西。 您不需要它,它将帮助减少代码中的某些复杂性

“核心”问题与ListModel的实现有关。 更改模型后,需要生成一个适当的事件。 由于列表的整个结构已更改,因此您将需要使用fireContentsChanged ,例如...

public class WlasnyMode<T> extends AbstractListModel<String> {
    //...
    void addElement(String text) {

        this.text.add(text);
        Collections.sort(this.text);
        fireContentsChanged(this, 0, this.text.size() - 1);

    }

}

而且, KeyListener对于处理输入是一个糟糕的选择,尤其是当ActionListener将以平台无关的方式提供相同的工作时……

public class MyTextField extends JTextField implements ActionListener {

    WlasnyMode model;

    MyTextField(WlasnyMode model) {
        super();
        this.model = model;
        addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        model.addElement(this.getText());
        System.out.println(this.getText());
    }

}

但这也引发了一些有关从JTextField扩展的有效性的问题

可运行的示例...

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.*;
import javax.swing.event.ListDataListener;

public class DrawSwing {

    public static void main(String[] args) {
        new DrawSwing();
    }

    public DrawSwing() {
        SwingUtilities.invokeLater(() -> createGUI());
    }

    protected void createGUI() {
        // utworzenie okna
        JPanel main = new JPanel();
        main.setLayout(new BorderLayout());
        WlasnyMode<String> model = new WlasnyMode<>();
        MyTextField text = new MyTextField(model);
        JFrame jf = new JFrame();

        // określenie tytułu okna
        jf.setTitle("Rysowanie");

        // obsługa zamknięcia okna JFrame
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // określenie położenia okna
        jf.setLocation(50, 50);

        // uniemoĹĽliwienie zmiany rozmiarĂłw okna
        jf.setResizable(true);

        JPanel uper = new JPanel();
        uper.setLayout(new GridLayout(1, 1));
        JPanel textPanel = new JPanel();
        jf.setLayout(new BorderLayout());
        textPanel.setLayout(new BorderLayout());

        uper.add(text);

        JList<String> lista = new JList<>(model);
        JScrollPane scroll = new JScrollPane(lista);
        lista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        lista.setLayoutOrientation(JList.VERTICAL);
        lista.setVisibleRowCount(30);
        lista.setBackground(Color.BLUE);

        main.add(uper, BorderLayout.NORTH);
        main.add(scroll, BorderLayout.CENTER);

        //jf.addKeyListener('f');
        // utworzenie obszaru rysowania - pulpitu
        // wymiana domyślnego pulpitu na własny
        jf.setContentPane(main);

        // upakowanie okna
        jf.pack();

        // wyświetlenie okna
        jf.setVisible(true);
    }

    public class WlasnyMode<T> extends AbstractListModel<String> {

        ArrayList<String> text = new ArrayList<>();

        //WlasnyMode()
        //{
        //  super();
        //  }
        @Override
        public String getElementAt(int liczba) {
            // TODO Auto-generated method stub
            return text.get(liczba);
        }

        @Override
        public int getSize() {
            // TODO Auto-generated method stub
            return text.size();
        }

        void addElement(String text) {

            this.text.add(text);
            Collections.sort(this.text);
            fireContentsChanged(this, 0, this.text.size() - 1);

        }

        void remove(int index) {
            text.remove(index);
        }

        void removeRange(int fromIndex, int toIndex) {
            for (int i = fromIndex; i < toIndex; i++) {
                text.remove(i);
            }
        }

        public void addListDataListener(ListDataListener l) {
            super.addListDataListener(l);
        }

    }

    public class MyTextField extends JTextField implements ActionListener {

        WlasnyMode model;

        MyTextField(WlasnyMode model) {
            super();
            this.model = model;
            addActionListener(this);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            model.addElement(this.getText());
            System.out.println(this.getText());
        }

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM