我有一个由jPanel组成的gridlayout。每个JPanel包含一个JLabel,它们是9x9。因为这是一个象棋游戏,我需要能够在某些事件(例如可能的移动选项或濒危场)上突出显示每个jPanel或其jLabel。但是,我只能突出显示设置了图标(图形)的字段,这意味着空的jLabel可能没有维度。
这就是我在jLabel(it sucks中放置一个数字的方法,但它有点奏效):
public void drawFigureAt(Figure fg, int x, int y) {
//retrieve the Jlabel from the field array
JLabel pole = policka_l[y*8+x];
//Set icon from file
pole.setIcon(new ImageIcon(fg.imageName()+(fg.color==1?"_white":"_black")+".png"));
//force redraw or whatever it is
pole.revalidate();
}
现在有些字段以非常透明的黑色突出显示,所以我可以看到JLabels和它们的图标一样大。
这是我强调的方式:
public void highlightField(int x, int y, Color color) {
//Get the JLabel obejct
JLabel pole = policka_l[y*8+x];
//Set the color as the background
pole.setBackground(color);
//What is this?
pole.setOpaque(true);
//Another magic
pole.revalidate();
repaint();
}
但是,正如我所说,如果JLabel没有图标,则无法突出显示,这对我来说非常悲伤。我更糟糕的是,这是一个必须在今天早上工作的学校项目,所以使用不同的渲染系统是没有问题的 我找到了一些如何处理它的线索,然而,它们不起作用。我非常希望:
JLabelinstance.setMinimumSize(new Dimension(70, 70));
不幸的是没有效果。
所以我现在想要的是让上面的功能工作,甚至更好 - 配置JLabel来填充他们的父JPanels,这样突出显示看起来不错,而不是愚蠢。
此外,我的数据根本没有调整窗口大小,所以它们往往会溢出。
答案 0 :(得分:3)
我有一个由jPanels组成的gridlayout。
你可以:
1)只需将标签直接添加到GridLayout即可。然后标签将是网格的大小
2)将面板的布局管理器设置为BorderLayout,然后调整标签大小以填充面板的整个空间。
pole.setBackground(color);
pole.setOpaque(true);
//pole.revalidate();
//repaint();
不需要revalidate()和repaint()方法。当属性发生变化时,Swing组件将自动重新绘制。
此外,我的数据根本没有调整窗口大小,所以它们往往会溢出。
不要使用setSize()。您应该将图标添加到标签,然后标签到网格。然后打包()框架,网格的大小将保持最大的图标。