java - 每次点击 JList 都会重新绘制 JPanel

标签 java swing jpanel jlist mouse-listeners

每次单击 JList 项目时,我需要清除并刷新当前面板并加载另一个面板,该面板通过方法“populateWithButtons()”返回。 temp 是一个 int 变量,用于存储在 JList 中单击的内容。我该如何纠正以下问题?

        list_1.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent evt) {

                //refresh + populate JPanel
                Food food = new Food();             
                JPanel panel2 = new JPanel();
                JPanel pane11 = new JPanel();


                panel2.add(panel1);
                panel1.validate();
                panel1.repaint();
                panel1.setBounds(153, 74, 281, 269);

                panel1.add(food.populateWithButtons(temp));             
                contentPane.add(panel2);
        }

最佳答案

  1. 不要使用NullLayout

  2. 添加 ListSelectionListenerJList而不是 MouseListener , 否则你需要将点从鼠标转换为 JList 中的项目

  3. 使用 CardLayout而不是添加,删除JPanel s 在运行时,然后从 ListSelectionListener 中选择(ListSelectionModelSINGLE...)以切换准备好的卡片(JPanel有一些内容)

编辑

enter image description here

.

enter image description here

.

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class CardlayoutTest {

    private Color[] colors = new Color[]{Color.BLACK, Color.RED, Color.GREEN, Color.BLUE};
    private JFrame frame = new JFrame();
    private JList list = new JList();
    private JPanel panel = new JPanel();
    private CardLayout card = new CardLayout();

    public CardlayoutTest() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setLayout(card);
        Vector<String> items = new Vector<String>();
        for (int x = 0; x < colors.length; x++) {
            JPanel pnl = new JPanel(new BorderLayout());
            pnl.setBackground(colors[x]);
            panel.add(pnl, colors[x].toString());
            items.add(colors[x].toString());
        }
        list = new JList(items);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    String card = list.getSelectedValue().toString();
                    CardLayout cL = (CardLayout) (panel.getLayout());
                    cL.show(panel, card);
                }
            }
        });
        frame.add(new JScrollPane(list), BorderLayout.WEST);
        frame.add(panel);
        frame.setPreferredSize(new Dimension(400, 150));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CardlayoutTest();
            }
        });
    }
}

关于java - 每次点击 JList 都会重新绘制 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19510789/

相关文章:

java - 如果定义了 maxLength 和模式限制,则针对长字符串验证 XML 的速度会很慢

Java 跨驱动器移动文件会导致 DirectoryNotEmptyException

java - 单击按钮时 Windows 未打开

java - 如何使用注释将 Servlet 操作映射到 JSP 路径?

java - 为 dev/QA/prod 配置 Java EE 6

java - 刷新 jtable 的内容

java - 将 JList 项目 (JPanel) 左对齐

java - Swing 面板颜色变化

java - 如何以编程方式更改 XML 中的值

java - 什么以及如何将 Java Swing 概念与云相关?