画在窗口和空白的窗口

时间:2016-01-15 15:25:13

标签: java window paint

我有一个程序可以在列表中添加点,并计算这些点创建的图形区域。 我无法添加该窗口的屏幕,但我将解释发生了什么。 我在Java中创建了JFrameForm,并在左侧放置了一些标签和文本字段,并在右侧留下了一些空格来绘制我添加到列表中的点。 问题是每当我绘制任何窗户变得空白时。单击标签后,标签会消失,文本字段会显示。

我的第二个问题是如何用paint()函数以其他方式绘制? 让我说我将点添加到列表中,当我单击一个按钮时,我希望它在我的窗口右侧绘制(使用drawOval()或推荐我其他功能)。

//所有导入

公共类NewJFrame扩展了javax.swing.JFrame {

public void paint(Graphics g) {
    g.drawLine(600, 150, 700, 150);
}

public NewJFrame() {
    initComponents();
}


@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jLabel1 = new javax.swing.JLabel();
    jLabel2 = new javax.swing.JLabel();
    jTextField1 = new javax.swing.JTextField();
    jTextField2 = new javax.swing.JTextField();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();
    jLabel3 = new javax.swing.JLabel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jLabel1.setLabelFor(jTextField1);
    jLabel1.setText("X: ");
    jLabel1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

    jLabel2.setLabelFor(jTextField2);
    jLabel2.setText("Y:");
    jLabel2.setName("labelY"); // NOI18N

    jTextField1.setName("textX"); // NOI18N

    jTextField2.setName("textY"); // NOI18N
    jTextField2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jTextField2ActionPerformed(evt);
        }
    });

    jButton1.setText("ADD");
    jButton1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    jButton2.setText("PROCEED");
    jButton2.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    jLabel3.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel1)
                            .addGap(18, 18, 18)
                            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel2)
                            .addGap(18, 18, 18)
                            .addComponent(jTextField2))))
                .addGroup(layout.createSequentialGroup()
                    .addGap(6, 6, 6)
                    .addComponent(jButton1)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jButton2))
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 316, javax.swing.GroupLayout.PREFERRED_SIZE)))
            .addContainerGap(419, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(86, 86, 86)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jLabel1))
            .addGap(26, 26, 26)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jLabel2))
            .addGap(32, 32, 32)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jButton1)
                .addComponent(jButton2))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 33, Short.MAX_VALUE)
            .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(24, 24, 24))
    );

    jLabel1.getAccessibleContext().setAccessibleName("labelX");
    jLabel2.getAccessibleContext().setAccessibleName("labelY");
    jTextField1.getAccessibleContext().setAccessibleName("textX");
    jTextField2.getAccessibleContext().setAccessibleName("textY");

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

private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) {                                            
    // TODO add your handling code here:
}                                           
protected List<Point> list = new ArrayList<>();
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try {        
        list.add(new Point( Integer.valueOf(jTextField1.getText()), Integer.valueOf(jTextField2.getText()) ));
    }catch(NumberFormatException e) {
        System.out.println("Error");
    }
    jTextField1.setText("");
    jTextField2.setText("");
}                                        

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    TwoLists two = new TwoLists(list);

    list = two.sortLists();

    jLabel3.setText("Area: " + Triangularyzacja.countFigureArea(list));
}                                        


public static void main(String args[]) {

    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>


    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });


}

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
// End of variables declaration                   

}

这是代码(对不起风格,但不知道如何更好地粘贴它)。 它全部由NetBeans生成,尽管paint()函数在开头并且它破坏了所有布局(它变得空白)。我有8个类,其中包含机制代码。

1 个答案:

答案 0 :(得分:0)

首先,您需要一个组件可以像JPanel或JLabel一样绘制,而不是仅仅在框架本身上绘制(如果组件是透明的(opaque = true)则无关紧要。能让你更好地掌控未来的发展。

让我们说它是你放在GUI表单上的JPanel(比如说 jPanel1 )并且想要在它上面绘图,你可以创建并使用像这样的方法(无论你喜欢什么,都可以命名方法:):

public static void drawMyStuff(JPanel panel) {
    // Declare and initialize a graphics object 
    // based on the supplied component.
    Graphics g = panel.getGraphics();

    // Set the color we want to use...
    g.setColor(Color.red);

    // Draw a red line horizontally through the 
    // center of the supplied component.
    g.drawLine(0, panel.getHeight()/2, panel.getWidth(), panel.getHeight()/2);

    // Close the Graphics object, we don't need it anymore.
    g.dispose();

    // Update the supplied component so as
    // to display what we've drawn.
    panel.revalidate(); 
}

你可以把这种方法放在哪里? 在项目中的任何公共课程中。

您如何以及在何处调用此方法?

drawMyStuff(jPanel1);

您可以从任何您喜欢的地方调用此方法(因为它是一个公共方法),只要可以获得对提供的组件的引用。

基本上这意味着你应该从你提供的JPanel所在的同一个Class中调用这个方法,除非JPanel本身也是公共的。

您可能希望从JButton actionPerformed 事件中调用此方法:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    drawMyStuff(jPanel1);
}

如果您希望使用 JLabel ,只需在方法声明中更改参数声明,

例如:

public static void drawMyStuff(JLabel panel) {....}

或者,如果您确实想直接绘制到 JFrame ,那么:

public static void drawMyStuff(JFrame panel) {....} 

如果您要直接在 JFrame 表单上绘图,那么您可以从扩展的JFrame类中调用此方法,如:

drawMyStuff(this);

现在, drawMyStuff()方法功能不强。它只是在我提供的组件的中心绘制一条红线。如果我想根据应用程序中的某些条件不时更改颜色和/或线长,该怎么办?

在这种情况下,我们需要在方法声明中添加更多参数,并根据需要使用这些参数来修改绘制的行。让我们在方法中添加一些参数来处理颜色,一个行起点( in 像素)和行结束点(以像素为单位)。这是我们的新方法声明:

public static void drawMyStuff(JPanel panel, Color color, int startPoint, int endPoint) { ... }

正如您在上面的方法声明中所看到的,我们仍然有我们的组件对象,在这种情况下是 JPanel ,我们需要这个,以便我们的方法知道要绘制什么。我们还添加了一个方便地命名为 color 的Color对象参数,以便我们可以提供我们想要的线条颜色。

我们还添加了两个名为 startPoint endPoint 的整数类型参数。 startPoint 参数将告诉我们的方法在提供的组件中沿X轴(水平面)开始彩色线的位置。 endPoint 参数将告诉我们的方法在同一水平轴上结束彩色线的位置。这两个参数确定行的实际长度(以像素为单位)(endPoint - startPoint =长度,以像素为单位)。

现在我们有了额外的参数,让我们修改我们的方法代码体以适应这些非常相同的参数:

public static void drawMyStuff(JPanel panel, Color color, int startPoint, int endPoint) {
    // Declare and initialize a graphics object 
    // based on the supplied JPanel.
    Graphics g = panel.getGraphics();

    // Set the color we want to use...
    g.setColor(color);  // here we supply our color parameter

    // Draw a red line horizontally through the 
    // center of the supplied JPanel. Notice our 
    // new startPoint and endPoint parameters are
    // supplied here.
    g.drawLine(startPoint, panel.getHeight()/2, endPoint, panel.getHeight()/2);

    // Close the Graphics object, we don't need it anymore.
    g.dispose();

    // Update the supplied JPanel so as
    // to display what we've drawn.
    panel.revalidate(); 
}

要调用此方法,我们可以这样做:

drawMyStuff(jPanel1, Color.blue, 20, 80);

这将沿jPanel1的中心水平绘制一条蓝色的60像素长线,从左边缘开始20像素。

我知道画一条简单的线并不是你想做的,但你现在知道如何轻松修改这个方法,让它做你喜欢的任何事情。