在面板的边框上放置一个按钮

时间:2010-02-20 19:10:46

标签: java user-interface swing netbeans

有没有办法用它上面的按钮创建边框类?像这样:example

一个重要条件 - 按钮必须与边框位置对齐,因为面板可以改变其大小。所以imho LayeredPane不适合这个 - 它没有任何对齐。

有一个想法 - 模仿按钮:

  • 为面板
  • 创建我的课程
  • 覆盖paintComponent()并在边框上绘制按钮图像
  • 覆盖它的鼠标事件并使用它像按钮

但是。也许有办法将真正的按钮放在边框上?

3 个答案:

答案 0 :(得分:1)

我认为标准边框无法实现这一点,主要是因为Border不是Container,因此无法添加其他组件。

但是,如果您愿意使用自定义边框实现,则可以伪造边框,例如:

private class BorderFaker extends JPanel
{
  public BorderFaker()
  {
    add( new JButton( "Faked!" ) );
  }

  @Override
  public void paintComponent( Graphics g )
  {
    super.paintComponent( g );
    drawFauxBorder( g );
  }

  private void drawFauxBorder( Graphics g )
  {
    g.setColor( UIManager.getColor( "border" ) );
    g.drawRect( 15, 15, getWidth() - 30, getHeight() - 30 );
  }
}

这显示了你可以这样做的方式,但它引入了很多问题,例如区分你想要的边界内部和边界上的组件(我只是硬编码了“假! “示范按钮)。而且你仍然需要组织相对于“边界”的组件布局。它需要一些小心处理组件和一些方便的布局工作 - 正如@trashgod最初建议的那样。

尽管如此,我还是不知道,我宁愿做这样的事情并伪造边框,而不是伪造一个按钮。如果您绘制自己的按钮,则会失去对当前外观的依从性,除非您按下UI按钮执行所有操作(处理翻转,布防状态等),否则它看起来不太好。

答案 1 :(得分:1)

Component Border类旨在允许您将组件作为边框添加到任何组件。

默认行为是在现有边框内添加组件。我没有进行完整的测试,但看起来可以通过以下方式自定义类以在现有边框之上添加组件:

// component.setLocation((int)x2, (int)y2);
component.setLocation(10, 0);

答案 2 :(得分:0)

你一定要看Using Layout ManagersHow to Use BoxLayout中的第二个示例与您的示例非常相似。

附录:如AbstractBorder所述,可以延长Creating Custom Borders以达到预期的效果。你可以传递按钮的监听器,如here所述,或维护你自己的监听器列表。