首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘图窗口和空白窗口

绘图窗口和空白窗口
EN

Stack Overflow用户
提问于 2016-01-15 15:25:13
回答 1查看 72关注 0票数 0

我有一个程序,将点数添加到列表中,并计算这些点数所创建的数字区域。我不能添加那个窗口的屏幕,但我要解释一下发生了什么。我用Java创建了JFrameForm,在左边放置了一些标签和文本字段,在右边留下了一些空间来绘制我添加到列表中的点。问题是,每当我画任何东西时,窗户都会变成空白。单击标签时,标签消失,文本字段出现。

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

//所有进口

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

代码语言:javascript
复制
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个类,其中包含机械代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-15 18:47:33

首先,您需要一个组件像JPanel或JLabel之类的东西,而不仅仅是框架本身(而且组件是否透明也没关系(不透明=真)。这将使你更好地控制未来的发展。

假设它是您放置在GUI表单上的一个JPanel (例如jPanel1),并且您想要在其上进行绘图,您可以创建和使用类似于此的方法(任意命名该方法:):

代码语言:javascript
复制
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(); 
}

你能把这种方法放在哪里?在项目中的任何公共类中。

您将如何和在何处调用此方法?

代码语言:javascript
复制
drawMyStuff(jPanel1);

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

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

您可能想要调用此方法,可能是从一个actionPerformed事件中调用的:

代码语言:javascript
复制
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    drawMyStuff(jPanel1);
}

如果您希望在JLabel上绘图,那么只需更改方法声明中的参数声明,

例如:

代码语言:javascript
复制
public static void drawMyStuff(JLabel panel) {....}

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

代码语言:javascript
复制
public static void drawMyStuff(JFrame panel) {....} 

如果要直接绘制到 JFrame 表单上,则可以从扩展的JFrame类调用此方法,如:

代码语言:javascript
复制
drawMyStuff(this);

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

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

代码语言:javascript
复制
public static void drawMyStuff(JPanel panel, Color color, int startPoint, int endPoint) { ... }

正如您在上面的方法声明中所看到的,我们仍然有我们的组件对象(在本例中是一个JPanel ),我们需要这样做,这样我们的方法就知道要使用什么了。我们还添加了一个名为的颜色对象参数,这样我们就可以提供我们想要的颜色。

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

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

代码语言:javascript
复制
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(); 
}

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

代码语言:javascript
复制
drawMyStuff(jPanel1, Color.blue, 20, 80);

这将画一个蓝色的60像素长的直线沿jPanel1的中心水平,从左侧边缘开始20像素。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34814378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档