java - 如何修复现有绘图上的油漆

标签 java swing

我的 DrawPanel 有一些问题。我想制作一个烤架 - 应该使用用户通过定义行和冒号给出的参数来绘制。

例如,我输入 3 行和 5 个冒号 (:),Swing 应该绘制它。主要问题是,如果我在 TextField 中输入数字并按下绘制按钮,Swing 就会在旧格栅上绘制新格栅。此外,有时程序无法完成某些行或冒号,我不明白为什么。我已经添加了一些数字,例如 rows-6,因为 swing 绘制的像素比他应该绘制的多了几个像素。也许您也知道这个问题的解决方案。

在图片上你可以看到太多的线条。我使用蓝线来显示线条应该走多远。

绘图面板(JPanel)

import java.awt.Graphics;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Serge Junk
 */
public class DrawPanel extends javax.swing.JPanel {

    /**
     * Creates new form DrawPanel
     * 
     */
    private int rows = 1;
    private int cols = 2;
    public DrawPanel() {
        initComponents();
    }

    @Override
   public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        int width = getWidth();
        int height = getHeight();

         // draw the rows
        int rowHt = (height / rows)-1;
        for (int i = 0; i <= rows; i++){
            g.drawLine(0, i * rowHt, width, i * rowHt);
        }


        // draw the columns
        int rowWid = (width / cols)-1;
        for (int i = 0; i <= cols; i++){
           g.drawLine(i * rowWid, 0, i * rowWid, height);
        }

    }

   public void setRows(int pRows){
       rows = pRows;
   }

    public void setCols(int pCols){
      cols = pCols;
   }
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        setPreferredSize(new java.awt.Dimension(300, 200));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// </editor-fold>                        


    // Variables declaration - do not modify                     
    // End of variables declaration                   
}

主机(JFrame)

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Serge Junk
 */
public class MainFrame extends javax.swing.JFrame {

    /**
     * Creates new form MainFrame
     */
    public MainFrame() {
        initComponents();
    }

    public void updateView()
    {
        drawPanel1.repaint();
    }
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        drawPanel1 = new DrawPanel();
        jLabel1 = new javax.swing.JLabel();
        rowTextField = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        colsTextField = new javax.swing.JTextField();
        drawButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout drawPanel1Layout = new javax.swing.GroupLayout(drawPanel1);
        drawPanel1.setLayout(drawPanel1Layout);
        drawPanel1Layout.setHorizontalGroup(
            drawPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 600, Short.MAX_VALUE)
        );
        drawPanel1Layout.setVerticalGroup(
            drawPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 200, Short.MAX_VALUE)
        );

        jLabel1.setText("Lignes");

        jLabel2.setText("Colonnes");

        drawButton.setText("Draw");
        drawButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                drawButtonActionPerformed(evt);
            }
        });

        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.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel1)
                        .addGap(18, 18, 18)
                        .addComponent(rowTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jLabel2)
                        .addGap(18, 18, 18)
                        .addComponent(colsTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(25, 25, 25)
                        .addComponent(drawButton))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(28, 28, 28)
                        .addComponent(drawPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 600, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(26, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(41, 41, 41)
                .addComponent(drawPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 14, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(rowTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel2)
                        .addComponent(colsTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(drawButton)))
                .addContainerGap())
        );

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

    private void drawButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
        //E
        int row = Integer.valueOf(rowTextField.getText());
        int col = Integer.valueOf(colsTextField.getText());
        //T
        drawPanel1.setRows(row);
        drawPanel1.setCols(col);
        //S
        updateView();
    }                                          

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        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(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JTextField colsTextField;
    private javax.swing.JButton drawButton;
    private DrawPanel drawPanel1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JTextField rowTextField;
    // End of variables declaration                   
}

最佳答案

Netbeans draw the new grill over the old one.

paintComponent() 方法中的第一条语句应该是:

super.paintComponent(g);

这将在您进行自定义绘画之前清除背景。

drawPanel1.setRows(row);
drawPanel1.setCols(col);
//S
updateView();

不需要 updateView() 方法。相反,setRows(...)setCols(...) 方法都应直接调用 repaint()。也就是说,当组件的属性发生更改时,组件有责任重新绘制自身。

sometimes the program doesn't complete some rows or colons and I don't understand why.

int rowHt = height / rows-1;

使用公式时要明确,这样我们就能准确地知道您的意图,而不是依赖编译器。所以你应该使用:

int rowHt = (height / rows) - 1;

不要害怕为参数创建变量:

//g.drawLine(i * rowWid, 0, i * rowWid, height-5);
int xOffset = i * rowWidth;
int yEnd = height - 5;
g.drawLine(xOffset, 0, xOffset, yEnd);

这样您就可以轻松添加调试代码,以准确查看用于绘制线条的值:

System.out.println(xOffset + " : " + yEnd);

现在您应该能够确定您的逻辑是否正确。

关于java - 如何修复现有绘图上的油漆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58310987/

相关文章:

java - 查找到所选点特定距离内的所有地址的最佳方法是什么

java - 如何防止 Eclipse 在打开新文件时使用现有文件选项卡

java - JPA 和 Hibernate 中的 persist() 和 merge() 有什么区别?

java - 向 JTable 中插入一行

java - 使用 JFileChooser 将图像加载到 JLabel 图标中

java - 在java中使用图形绘制多个圆

java - 如何在现有的Web 项目中集成Web 服务?

java - 具有长、整型和短参数的重载方法之间出现意外的歧义

java - JButton Java 的继承 - 重写方法问题

java - 从 JPanel 附加到 Window 事件