使用JButton的JPanel自定义绘图时出现图形故障

时间:2012-03-23 19:59:04

标签: java swing drawing

我有一个JPanel,它实现自定义绘图来绘制背景。在此之后,应用程序可以放置JButton来检测JPanel某些区域的点击。但是,当使用鼠标突出显示(非不透明)按钮时,基础JPanel的图形变得非常糟糕。

My game

这些是带有自定义绘图的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);
}

2 个答案:

答案 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上的组件。然后按住鼠标按钮时,这些线也应该可见。