Java 连接到JPanel的线路不工作

Java 连接到JPanel的线路不工作,java,swing,graphics,jpanel,line,Java,Swing,Graphics,Jpanel,Line,我的主要方法是这样设置的: JPanel contentPane; contentPane = (JPanel) rootPaneContainer.getContentPane(); contentPane.setSize(508, 650); panel = new JPanel(); panel.setBounds(contentPane.getX(), contentPane.getY(), 508, 470); panel.setBackgrou

我的主要方法是这样设置的:

JPanel contentPane;
    contentPane = (JPanel) rootPaneContainer.getContentPane();
    contentPane.setSize(508, 650);
    panel = new JPanel();
    panel.setBounds(contentPane.getX(), contentPane.getY(), 508, 470);
    panel.setBackground(new Color(177, 154, 212));
    panel.add(new LinePaintDemo());   
    contentPane.add(panel);
    contentPane.setVisible(true);
public class LinePaintDemo extends JPanel{
    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      try
      {
        scan = new Scanner(new File("area.map"));
      }
      catch (FileNotFoundException e)
      {
        e.printStackTrace();
      }

      StringTokenizer token;

        double prevx = 0;
        double prevy = 0;
        double nextx = 0;
        double nexty = 0;

      while(scan.hasNextLine())
      {
        String line = scan.nextLine();
        token = new StringTokenizer(line, ",");
        if(token.nextToken().equals("4"))
        {
          prevx = Double.parseDouble(token.nextToken());
          prevy = Double.parseDouble(token.nextToken());
        }
        else
        {
          nextx = Double.parseDouble(token.nextToken());
          nexty = Double.parseDouble(token.nextToken());    
        }

        g.drawLine((int)prevx, (int)prevy, (int)nextx, (int)nexty);
        prevx = nextx;
        prevy = nexty;
      }           
我的LinePaintDemo类的设置如下:

JPanel contentPane;
    contentPane = (JPanel) rootPaneContainer.getContentPane();
    contentPane.setSize(508, 650);
    panel = new JPanel();
    panel.setBounds(contentPane.getX(), contentPane.getY(), 508, 470);
    panel.setBackground(new Color(177, 154, 212));
    panel.add(new LinePaintDemo());   
    contentPane.add(panel);
    contentPane.setVisible(true);
public class LinePaintDemo extends JPanel{
    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      try
      {
        scan = new Scanner(new File("area.map"));
      }
      catch (FileNotFoundException e)
      {
        e.printStackTrace();
      }

      StringTokenizer token;

        double prevx = 0;
        double prevy = 0;
        double nextx = 0;
        double nexty = 0;

      while(scan.hasNextLine())
      {
        String line = scan.nextLine();
        token = new StringTokenizer(line, ",");
        if(token.nextToken().equals("4"))
        {
          prevx = Double.parseDouble(token.nextToken());
          prevy = Double.parseDouble(token.nextToken());
        }
        else
        {
          nextx = Double.parseDouble(token.nextToken());
          nexty = Double.parseDouble(token.nextToken());    
        }

        g.drawLine((int)prevx, (int)prevy, (int)nextx, (int)nexty);
        prevx = nextx;
        prevy = nexty;
      }           
area.map包含要从中绘制线的点。4表示移动到,5表示从。诸如此类

4139.0172.0

5135.0175.0

5131.0176.0

5125.0190.0

然而,当它被绘制时,它只是在我的JPanel中显示一个小框,如下所示:

关于它为什么这样做有什么建议吗

  • 您的自定义面板需要实现
    getPreferredSize()
    方法,以便布局管理器可以完成其工作

  • 绘画方法只适用于绘画。您不应该使用扫描仪获取输入。扫描程序逻辑应该从类的构造函数中调用。然后,您将有两种方法来进行绘制a)您可以存储要绘制的对象,或者b)您可以绘制缓冲区图像。查看这两种方法的示例


  • 为了更快地获得更好的帮助,发布一个or.
    panel.setBounds(contentPane.getX(),contentPane.getY(),508470)
    不是一个好主意,原因有很多,首先,
    contentPane
    有一个布局管理器,坐标系也基于父坐标系,这意味着左上角是
    0x0
    ,它已经偏移了you@MadProgrammer好吧,若我去掉了挫折,那个么面板是如何在contentPane中表示的呢?删除设置边界只需删除彩色JPanelBy默认值
    JFrame
    使用
    BorderLayout
    ,但
    JPanel
    使用
    FlowLayout
    。我想您可能需要看一看