Java Graphics(画线)

时间:2016-10-21 18:31:03

标签: java swing graphics

我不熟悉java Graphics,我想在3个按钮上画一条线。我找到了一些绘制线条的方法,但没有一种方法将它绘制在按钮之上。

这是我的GUI类

public class GUI extends JFrame{
JButton[] buttons;

GUI()
{
    setSize(255, 390);
    setLocation(0, 0);      
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(null);
    setVisible(true);       
}
public void paint(Graphics g) {
    super.paint(g);
    //TODO add the line    
}
void drawButtons()
{
    buttons=new JButton[9];
    int x=5,y=80;
    for(int i=0;i<buttons.length;i++)
    {
        buttons[i]=new JButton("");
        buttons[i].setSize(70,70);
        buttons[i].setLocation(x,y);
        buttons[i].setFont(new Font("Arial", Font.PLAIN, 45));
        buttons[i].setBorder(BorderFactory.createBevelBorder(1,Color.black,Color.black));
        y+=(i%3==2)?75:0;
        x=(i%3==2)?5:x+75;          
        add(buttons[i]);
    }
}

}

简单地说,我想创建一个创建一条线的函数,并将该线的位置作为参数获取。我希望这条线位于按钮之上。我怎样才能做到这一点?提前谢谢。

2 个答案:

答案 0 :(得分:2)

  

我希望线条位于按钮之上。

考虑使用Glass pane进行自定义绘制,重写其paintComponent方法,以便在JFrame之上进行绘制。例如:

public class CustomGlassPane extends JPanel{

    public CustomGlassPane(){
        setOpaque(false);
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.drawLine(10, 100, 2000, 100);
    }
}

然后,您将设置JFrame

的“平板”窗格
setGlassPane(new CustomGlassPane());
getGlassPane().setVisible(true);

另外,我还建议不要使用null布局 - 选择最适合您布局的LayoutManager(并注意您可以嵌套布局)。我还建议覆盖paintComponent而不是paint(如您发布的代码尝试的那样)。

答案 1 :(得分:2)

查看A Closer Look at the Painting Mechanism上的Swing教程中的部分。

正如您所看到的,JPanel将调用paintChildren(...)方法。因此,您可以覆盖此方法以在面板的子项之上绘制线条:

@Override
protected void paintChildren(Graphics g)
{
    super.paintChildren(g);

    // paint the line here
}

更好的选择是使用专门为此设计的JLayer。阅读Decorating Components With JLayer上Swing教程中的部分,了解更多信息和示例。