我有一个数组的JPanel
与JLabel
的图标,代表一个座位在剧院,所有这些都是使用循环生成。加载座位时,那些已经预订的需要有一个不同的图像图标。所以if(){}
检查是在所有座位上执行的,如果座位被预订,在它们生成后更改标签图标。
但是我磁盘上的图像图标加载速度不够快,所以有时面板只添加到最后一个预订的,或者根本没有。代表椅子的每个面板都添加了MouseListener
接口。因此,鼠标悬停或单击ImageIcon
添加到面板的对象也会发生变化,当这种情况发生时会有太多的延迟。我认为这与磁盘上的图像有关!。
>
我怎样才能加载和存储那些图标图像2,78KB大小在内存中,并在内存中引用它,所以它不会延迟读取它们?
当点击一个座位时,我需要改变那个座位的标签图像,并从那个座位上移除鼠标侦听器。有没有办法在不引用特定鼠标侦听器的情况下将鼠标侦听器移除到那个特定的座位上。我需要在鼠标侦听器本身之外做到这一点!
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 JButton,但发生的是图像根本没有加载到按钮上…我缺少什么?鼠标悬停也没有…如果我有例如charis. setBack地颜色();悬停或单击…所以我现在需要在单击和悬停时更改图像按钮,我试过椅子.setRolloverIcon();和.setIcon();两者都不起作用。怎么了。我的图像与类文件在同一个目录中…所以这不是问题…
int localLlong, int localWidth是座位将被绘制的房间的大小。大约1m^2/个座位
对于三个图像,在类初始化时加载它们,并将它们存储为类的属性。当然,3个图像中的每一个都可以根据需要在任意数量的图标中使用。