每当我点击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);
}
答案 0 :(得分:3)
不要使用NullLayout
将ListSelectionListener添加到JList而不是MouseListener,否则您需要将点从鼠标转换为JList中的Item
使用CardLayout代替添加,在运行时删除JPanel,然后从ListSelectionListener
(ListSelectionModel
到SINGLE
选择...)切换准备好的卡片(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<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();
}
});
}
}
答案 1 :(得分:0)
在添加到validate()
之后移动repaint()
和contentPane
,因为在那一点上它将被重绘。
答案 2 :(得分:0)
使用正确的架构模式 - 例如MVC。您拥有here的基本用法示例。
MouseAdapter
将更新model
中所选项目的变量,并使用repaint()
方法刷新视图(而不是直接在GUI上工作)。JPanel
方法保留paint()
,该方法根据模型中的所选元素显示内容。 你以后会感谢我的。 ;)在你的方法中,你将失去灵活性,很快就会遇到另一个问题。
MouseAdapter
(或其他听众)中保留对该视图的引用。mouseClicked()
方法中创建一个新面板,然后使用setter覆盖旧面板。