我有一个JPanel
数组JLabel
,图标代表剧院的座位,所有这些都是使用循环生成的。
在加载座椅时,已经预订的座椅需要具有不同的图像图标。因此,如果座位在预订后生成,则在所有座位上执行if(){}
检查以更改标签图标。
但是我的磁盘上的图像图标加载速度不够快,所以有时候面板只会添加到最后一个预订或根本没有。
代表主席的每个面板都添加了MouseListener
个界面。因此,鼠标悬停或单击添加到面板的ImageIcon
对象也会发生变化,发生这种情况时会有太多延迟。我认为这与磁盘上的图像有关!。
如何在内存中加载和存储大小为2,78 KB的图标图像并在内存中引用它,以便不会延迟阅读它们?
点击座位后,我需要更改该座位的标签图像,并从该座位上删除鼠标监听器。有没有办法在不引用特定鼠标侦听器的情况下将鼠标侦听器移除到该特定位置。我需要在鼠标监听器之外做到这一点!
panel.removeAll();
不会删除生成面板时添加的鼠标侦听器。
public void drawSeats(int ammountSeat, int localLength, int localWidth) {
pnlSeatsHolder = new JPanel();
pnlSeatsHolder.setPreferredSize(new Dimension(localLength * 40,localLength * 45));
pnlSeatsHolder.setLayout(new FlowLayout());
for (int d = 0; d <= (ammountSeat); d++) {
imgIconYellow = new ImageIcon("seatYellow.png");
imgIconBlue = new ImageIcon("seatBlue.png");
imgIconRed = new ImageIcon("seatRed.png");
JButton chairs = new JButton();
chairs.setPreferredSize(new Dimension(30, 40));
pnlSeatsHolder.add(chairs);
chairs.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
for (int i = 0; i < listSeatsObjects.size(); i++) {
if (listSeatsObjects.get(i).equals(e.getSource())) {
/*I need to do this also outside of this method! how can i refer to this MouseListener
* to forexample do the equivalent of chairs.removeMouseListener(this);*/
chairs.removeAll();
chairs.setIcon(imgIconRed);
chairs.repaint();
chairs.removeMouseListener(this);
// send information of the chair somewhere else
}
}
}
public void mouseEntered(MouseEvent e) {
// chairs.setBackground(Color.blue);
chairs.removeAll();
chairs.setIcon(imgIconBlue);
chairs.repaint();
}
public void mouseExited(MouseEvent e) {
// chairs.setBackground(Color.BLACK);
chairs.removeAll();
chairs.setIcon(imgIconYellow);
chairs.repaint();
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
});
}
}
所以这就是自己在调用时拉出座位的方法。我做了一些修改,因为@AndrewThompson建议,而不是JPanels我现在使用JButtons,但会发生的是图像根本没有加载到按钮上..我缺少什么?鼠标悬停时也没有......如果我有例如charis.setBackgroundColor();在悬停或点击..所以我现在我需要更改单击时按钮图像和悬停,我已经尝试了chairs.chairs.setRolloverIcon();和.setIcon();两者都不起作用。怎么了。我的图像与类文件位于同一目录中..因此无法解决问题..
int localLength,int localWidth是将绘制座位的房间的大小。大约1平方公尺/座位
答案 0 :(得分:1)
对于三个图像,在初始化类时加载它们并将它们存储为类的属性。当然,3个图像中的每一个都可以根据需要在多个图标中使用。