无法在现有面板上绘制线条

时间:2012-11-24 10:59:13

标签: java swing jpanel layout-manager paintcomponent

我正在用Swing编写我的第一个Java GUI。 我正在尝试创建一个10X10点的面板,并在这些点上绘制线条。

问题是我只能创建上述之一。 这意味着我可以创建一个10X10点的矩阵或创建线。

这是我的代码:

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("DrawMatrix");
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new DrawRectPanel());
        frame.setSize(240, 260);
        frame.setVisible(false);
        frame.getContentPane().add(new DrawLine());
        frame.setVisible(true);
   }
}

public class DrawRectPanel extends JPanel{
   final static int DIST = 20;
   final static int MAX_ROW = 11;
   final static int MAX_COL = 11;
   int i = 1;

@Override

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    {
        // Points matrix
        int x = 0;
        for(int row = 1; row < MAX_ROW; row++)
        {
             x = row * DIST;
            for(int col = 1; col < MAX_COL; col++)
            {
                int y = col * DIST;
                g.setColor(Color.blue);
                g.drawLine(x,y,x,y+1);
            }
        }
    }
  }
}

public class DrawLine extends JPanel {

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(20,20,40,40);
    }
 }

知道为什么吗?我应该以不同的方式使用setVisible吗?

1 个答案:

答案 0 :(得分:3)

在连续调用add(..)时,您会覆盖添加到 contentPane 的每个组件。

  

我希望他们两个都在中心,因为我想从点到点画线

您应该使用需要单个DrawingPanel的方法,可以将对象绘制到该方法中。您可能还需要一个数组来保存要绘制的形状,因此可以很容易地获取和操作paintComponent(..)

  • 请务必记住在Event Dispatch Thread via SwingUtilities.inovkeLater(..)上创建所有Swing组件

  • 不要在setSize()上致电JFrame,而是在设置pack()可见而非覆盖JFramegetPrefferedSize {之前致电setPrefferedSize {1}}并返回适合所有绘图的尺寸。

  • JPanel无需在getContentPand.add(..)上致电add(..),因为来电将转至 contentPane

以下是一个示例(基本上您使用上述修补程序编写代码)

enter image description here

JFrame