【问题标题】:Implementing Graphics within a JPanel在 JPanel 中实现图形
【发布时间】:2011-12-11 23:28:53
【问题描述】:

我一直在尝试在我用 Netbeans 制作的 GUI 应用程序中实现图形。我已经使用 GUI 编辑器完成了布局(按钮、文本框等),到目前为止一切正常。基本上我想要做的是在我的 JFrame 的下半部分生成一些图形(线条等),并将复选框、按钮等留在我的 JFrame 的上半部分。

从我看到的示例中,一般的方法是创建一个扩展 JPanel 的类,并包含用于创建线条和其他各种形状的图形代码。我已经能够独立于 GUI 编辑器实现这一点,但应用程序仅由占据整个 JFrame 的 JPanel 组成。我在 GUI 编辑器中用于执行此操作的不同方法要么生成了图形,但在我的 JFrame 中屏蔽了其他所有内容(即使是一小行),或者根本没有做任何事情。

理想情况下,我希望能够将任意大小的 JPanel 放置在我的 JFrame 上的任意位置,并创建包含在面板中的图形。我还希望我创建的图形的坐标被引用到 JPanel 而不是 JFrame(所以坐标 0,0 是我的 JPanel 的左上角,无论我决定将它放在哪里。)

有没有直接的方法来做到这一点?

(非常感谢示例代码)

【问题讨论】:

    标签: java swing graphics netbeans


    【解决方案1】:

    首先,您必须提供一个扩展 JPanel 的类,然后重写 paintComponent 方法以提供您自定义的图形绘制。

    然后在 JFrame 上,您需要使用适当的布局管理器在 JFrame 上放置多个组件。例如,您可以使用 GridLayout 将 Jframe 分成相等的两半。上面的可以包含带有按钮和控件的普通 JPanel,下面的将是带有自定义图形的自定义 JPanel。

    您在paintComponent 中使用的坐标将仅引用底部的JPanel。

    当然,如果您需要更具体的布局选项,您可以使用比 GridLayout 更高级的布局管理器。

    • 这也可以在 netbeans IDE 中通过右键单击组件并在自动调整大小选项中选择“垂直”和/或“水平”来完成。

    【讨论】:

    • 有没有办法使用 netbeans/swing GUI 编辑器来做到这一点?我的应用程序运行良好,图形显示在单独的框架中。理想情况下,我想在整个开发过程中使用 GUI 编辑器调整 JPanel 的大小和位置,而不是对其进行硬编码。
    • @Ben。是的,有办法。请参阅此问题的答案:stackoverflow.com/questions/816286/…。您可以将自定义 JPanel 添加到 Pallette,然后将其拖到布局管理器中。
    【解决方案2】:

    你可以去老派,简单而高效:

    1. 设置布局管理器为空

      contentPane.setLayout(null);

    2. 在你的类中实现 public void doLayout() 方法

    例如

       public void doLayout () {
          Dimension size      = getSize() ;
          int       x         = wizardImage.getImage().getWidth(this)+10 ;
          int       y         = 5 ;
          int       rowHeight = 18;
          super.doLayout() ;
          st_IMAGE.setBounds ( 5,((size.height-40)/2)-(wizardImage.getImage().getHeight(this)/2), wizardImage.getImage().getWidth(this), wizardImage.getImage().getHeight(this)) ;
          st_EXPORTTYPE.setBounds ( x, y, size.width-(x)-10, rowHeight ) ;
          y+=rowHeight ;
          rb_TAB_DELIM.setBounds ( x, y, size.width-(x)-10-100, rowHeight ) ;
          y+=rowHeight ;
          rb_COMMA_SEPARATED.setBounds ( x, y, size.width-(x)-10-100, rowHeight ) ;
          y+=rowHeight ;
          rb_FLAT_TEXT.setBounds ( x, y, size.width-(x)-10-100, rowHeight ) ;
          y+=rowHeight+10 ;
          pb_EXPORT.setLocation ( x, size.height-75 ) ;
          pb_CANCEL.setLocation ( x+pb_EXPORT.getMinimumSize().width+5, size.height-75 ) ;
    
       }
    

    【讨论】:

    • 撞到有人仍然生活在 AWT 边缘 :-),1)不要那样做,2)不要那样做,3)不要那样做,永远不要那样做方式:-) 没有别的可能......你的帖子不是反对票
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多