每次单击JList重新绘制JPanel

每次我点击一个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. 将ListSelectionListener添加到JList而不是MouseListener ,否则您需要将点从鼠标转换为JList中的Item

  3. 使用CardLayout代替添加,在运行时删除JPanel ,然后从ListSelectionListenerListSelectionModelSINGLE …)中选择切换准备好的卡( JPanel带有一些内容)

编辑

在此处输入图像描述

在此处输入图像描述

 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 items = new Vector(); 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(); } }); } } 

在添加到contentPane之后移动validate()repaint() ,因为在那一点上它将被重绘。

使用正确的架构模式 – 比如MVC 。 您在这里的基本用法示例。

  • 然后,您的MouseAdapter将使用repaint()方法更新model和刷新视图中所选项目的变量(而不是直接在GUI上工作)。
  • 该视图将使用覆盖paint()方法保存JPanel ,该方法根据模型中的选定元素显示内容。

你以后会感谢我的。 ;)在你的方法中,你将失去灵活性,很快就会遇到另一个问题。

糟糕的方式(但会起作用)

  • 在您的视图中,为所需的面板创建setter和getter。
  • MouseAdapter (或其他侦听器)中,保持对该视图的引用。
  • mouseClicked()方法中创建一个新面板,然后使用setter覆盖旧面板。