在调用pack()之后如何在面板上画一条线?

时间:2019-01-28 10:02:12

标签: java swing user-interface awt

我正在使用Swing组件以Java编写小型GUI。我的程序使用了几个重叠的面板,面板的大小在调用“ pack()”时决定。

我的问题是这个。我需要在JPanel之前知道特定pack()的尺寸,因为我需要在垂直下方画一条线。但是直到调用pack,我才能得到这个高度尺寸。

我在pack命令之前进行了System.out.println(myPanel.getSize())调用,它返回了(0, 0)。放入之后,它会返回面板的实际尺寸……就像您期望的那样。

那么,如何在面板的整个长度上画一条线,而又不知道其开始长度,还是在调用pack后以某种方式这样做呢?

1 个答案:

答案 0 :(得分:1)

您可以通过在面板上添加ComponentListener来实现。每当调整面板大小时,都会触发其componentResized()事件。在componentResized()方法中,您将始终获得面板的实际大小。尝试下面的示例,然后自己查看。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

public class PanelResize
{
  public static void main(String[] args)
  {
    CustomPanel panel = new CustomPanel();
    panel.addComponentListener(new ComponentAdapter()
    {
      @Override
      public void componentResized(ComponentEvent e)
      {
        System.out.println(panel.getSize());
        panel.repaint();
      }
    });

    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().add(panel);
    f.setBounds(300, 200, 400, 300);
    f.setVisible(true);
  }
}

class CustomPanel extends JPanel
{
  @Override
  protected void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    g.setColor(Color.blue);
    g.drawLine(getWidth()/2, 0, getWidth()/2, getHeight());
  }
}