【问题标题】:How to draw a line on a panel after pack() has been called?调用 pack() 后如何在面板上画一条线?
【发布时间】:2019-06-21 07:24:23
【问题描述】:

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

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

我在打包命令之前调用了System.out.println(myPanel.getSize()),它返回(0, 0)。当放入之后,它会返回面板的实际尺寸......正如您所期望的那样。

那么,如何在面板的整个长度上画一条线,或者在开始时不知道它的长度,或者在调用 pack 之后以某种方式这样做?

【问题讨论】:

  • “在面板的整个长度上画一条线” DYM 位于面板的左侧或右侧,还是介于两者之间?这条线的目的是什么?它为最终用户提供了什么?
  • 这条线可以充当“括号”,否则最终会。我想在矩形 JPanel 的任一侧创建“方括号”。所以,我想,要么把实际的图像放在那里,要么把它们画进去。我决定试着画它们。
  • “所以,我想,要么把实际的图像放在那里,要么把它们画进去。我决定试着画它们。”我会选择选项'C' .一个自定义的JComponentBracketComponent),它接受构造函数中的常量(Bracket.LEFTBracket.RIGHT)来决定渲染的方式。自定义组件将返回一个首选大小,以向布局提示渲染它的大小,但在调用渲染时,它将使用已分配给它的空间。

标签: java swing user-interface awt


【解决方案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());
  }
}

【讨论】:

  • 非常感谢,这似乎符合我的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 2017-04-02
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多