我有一个JPanel,它实现自定义绘图来绘制背景。在此之后,应用程序可以放置JButton来检测JPanel某些区域的点击。但是,当使用鼠标突出显示(非不透明)按钮时,基础JPanel的图形变得非常糟糕。
这些是带有自定义绘图的9个JPanel,每个JPanel都有2个填充JButtons(R和L)。右上方的块和看起来像是“新鲜”的块。右下角有两个突出显示的按钮,中间只有'R'等等。
我创建了这样的按钮:
rotatePanel = new JPanel();
rotatePanel.setOpaque(false);
GridLayout rotateLayout = new GridLayout(1, 2);
rotatePanel.setLayout(rotateLayout);
rotateRight = new JButton("R");
rotateRight.addActionListener(this);
rotateRight.setOpaque(false);
rotateRight.setContentAreaFilled(false);
rotateRight.setBorderPainted(false);
rotatePanel.add(rotateRight);
rotateLeft = new JButton("L");
rotateLeft.addActionListener(this);
rotateLeft.setOpaque(false);
rotateLeft.setContentAreaFilled(false);
rotateLeft.setBorderPainted(false);
rotatePanel.add(rotateLeft);
这是我的绘图代码:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Rectangle clipRect = g.getClipBounds();
clipRect.grow(-4, -4);
int thirdWidth = clipRect.width/3;
int thirdHeight = clipRect.height/3;
for (int x = 0; x < Board.DIM; x++) {
//Draw the columns
for (int y = 0; y < Board.DIM; y++) {
//Draw the rows
g.drawRect(thirdWidth * x, thirdHeight * y, thirdWidth, thirdHeight);
}
}
g.setColor(Color.BLACK);
g.drawRect(0, 0, clipRect.width, clipRect.height);
}
答案 0 :(得分:2)
当对子组件的更改需要重绘部分面板时,只需要绘制该组件重叠的区域。当您执行g.getClipBounds()
时,您将获得要绘制的区域,而不是整个面板的边界。您可能只想使用getWidth()
和getHeight()
。
答案 1 :(得分:0)
我不确定为什么,但在按钮上添加一个ActionListener强制重绘面板似乎有帮助:
rotateLeft.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
rotatePanel.repaint(); // rotatePanel must be final to be used here
}
});
只要按住按钮,就会看不到行,但是当激活actionListener时,会重新绘制行。
您还可以使用MouseListener作为rotateLeft按钮,该按钮强制重绘事件mousePressed,mouseReleased和mouseClicked上的组件。然后按住鼠标按钮时,这些线也应该可见。