Java - 如何在 JFrame 内的 IDE 生成的 JPanel 上绘制形状

标签 java netbeans jframe draw shapes

我正在使用 NetBeans IDE 编写 GUI 应用程序。它将计算各种原始 2D/3D 形状的面积/体积。 我在其中创建了一个新的 JFrame - JTabbedPane,它有两个用于 2D 和 3D 形状的选项卡。

我计划为每个形状的选项卡创建自定义 jpeg,这不是问题,但我不能真正在形状类型的选项卡内绘制形状(见图)。 enter image description here

只有一个.java 文件,我把它的内容粘贴在这里。请帮助我,我对如何解决这个问题感到非常困惑。

// @author Žanas Stundys
package geometrinis.projektas;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

//
public class PagrindinisLangas extends javax.swing.JFrame {


/* Creates new form PagrindinisLangas */
public PagrindinisLangas() {
    initComponents();

}
//
/* This method is called from within the constructor to initialize the form */
//@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jEditorPane1 = new javax.swing.JEditorPane();
    jTabbedPane1 = new javax.swing.JTabbedPane();
    jPanel1 = new javax.swing.JPanel();
    jTabbedPane2 = new javax.swing.JTabbedPane();
    jPanel3 = new javax.swing.JPanel();
    jPanel4 = new javax.swing.JPanel();
    jPanel2 = new javax.swing.JPanel();

    jScrollPane1.setViewportView(jEditorPane1);

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
    setResizable(false);
    setSize(new java.awt.Dimension(960, 480));

    jTabbedPane1.setToolTipText("");

    jTabbedPane2.setTabPlacement(javax.swing.JTabbedPane.LEFT);

    javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
    jPanel3.setLayout(jPanel3Layout);
    jPanel3Layout.setHorizontalGroup(
        jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 0, Short.MAX_VALUE)
    );
    jPanel3Layout.setVerticalGroup(
        jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 0, Short.MAX_VALUE)
    );

    jTabbedPane2.addTab("", new javax.swing.ImageIcon(getClass().getResource("/Assets/2D/square.png")), jPanel3, "Kvadratas / Stačiakampis"); // NOI18N

    javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
    jPanel4.setLayout(jPanel4Layout);
    jPanel4Layout.setHorizontalGroup(
        jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 0, Short.MAX_VALUE)
    );
    jPanel4Layout.setVerticalGroup(
        jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 0, Short.MAX_VALUE)
    );

    jTabbedPane2.addTab("", new javax.swing.ImageIcon(getClass().getResource("/Assets/2D/circle.png")), jPanel4, "Apskritimas"); // NOI18N

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jTabbedPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 876, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jTabbedPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 387, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );

    jTabbedPane1.addTab("2D", new javax.swing.ImageIcon(getClass().getResource("/Assets/icon2d.png")), jPanel1); // NOI18N

    javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
    jPanel2.setLayout(jPanel2Layout);
    jPanel2Layout.setHorizontalGroup(
        jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 0, Short.MAX_VALUE)
    );
    jPanel2Layout.setVerticalGroup(
        jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 0, Short.MAX_VALUE)
    );

    jTabbedPane1.addTab("3D", new javax.swing.ImageIcon(getClass().getResource("/Assets/icon3d.png")), jPanel2, ""); // NOI18N

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jTabbedPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 960, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jTabbedPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>                        

/* @param args the command line arguments */
public static void main(String args[]){
    /* Create and display the form */

    java.awt.EventQueue.invokeLater(() -> {
        new PagrindinisLangas().setVisible(true);
    });

}
// Variables declaration - do not modify                     
private javax.swing.JEditorPane jEditorPane1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JTabbedPane jTabbedPane2;
// End of variables declaration                   
}

最佳答案

要添加一个对自定义绘图有用的组件,我做的是这样的:

  1. 创建一个扩展 JPanel 的新类
  2. 在类中覆盖 paintComponent() 方法以绘制矩形或您想要的任何其他形状。如果构造函数将首选大小设置为非零,这将很有帮助。
  3. 编译新类。
  4. 打开我想在其中使用 JPanel 的 JPanel 或 JFrame 的设计 View 。
  5. 将新类从“项目”选项卡拖到您要在其中使用它的 JFrame/Jpanel 上。(如果您要多次使用同一个自定义面板,在项目选项卡中选择类可能会有所帮助,然后右- 单击工具 -> 添加到托盘,使其位于设计 View 中的托盘上。)

这是一个以这种方式使用的示例类:

public class PanelWithRectangle extends JPanel {

    public PanelWithRectangle() {
        setPreferredSize(new Dimension(200,100));
    }


    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); 
        Graphics2D g2d = (Graphics2D) g;
        g2d.draw(new Rectangle2D.Double(10, 10,20, 25));
    }
}

对于 3D 绘图,情况有所不同。 Swing 不支持 3D,因此我们需要使用一些 JavaFX。对于 JavaFX,不是扩展 JPanel,而是扩展 JFXPanel,而不是覆盖 paintComponent,而是创建一个场景对象并使用 setScene。此外,需要在 JavaFX 线程上调用 JavaFX 方法,因此我们需要使用 Platform.runLater() 在该线程上调用函数。

public class PanelWithBox extends JFXPanel {

    public PanelWithBox() {
        setPreferredSize(new Dimension(200,100));
        Platform.runLater(this::initFx);
    }

    private void initFx() {
        Group g = new Group();
        Scene scene = new Scene(g);
        Box box = new Box(20, 30, 40);
        box.setMaterial(new PhongMaterial(Color.RED));
        box.getTransforms().addAll(Transform.translate(50, 25), new Rotate(30, new Point3D(1, 1, 1)));
        g.getChildren().add(box);
        setScene(scene);
    }
}

关于Java - 如何在 JFrame 内的 IDE 生成的 JPanel 上绘制形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32930805/

相关文章:

java - Netbeans:JButton 按钮无法设置可见

java - 在 java netbeans 中以下代码的第 6 行出现错误

java - Java 面板上的错误事件

java - 当我进入 JFrame 时如何对 JTable 的列进行排序?

Java - 循环堆栈跟踪并获取类和方法实例?

java - 使用 RowMapper 和 JdbcTemplate 得到 NullPointerException

java - 写入 CSV 文件时,超过 15 位的数字将转换为 0

java - 如何从 netbeans 远程调试 jar

窗口中的 Java JFrame 矩形

java - 空输出文件(flush() 和 close() 已添加)