confused with java graphics paint

倾然丶 夕夏残阳落幕 提交于 2020-12-27 06:23:20

问题


i am very bigginer to java .i trying to draw a line in a jpanel (using netbean ide)..i read some articles .but problem is it draw thais line without calling it .i want to draw line by a button click ..and not on main form but in a panel ..how can i modify this code this is my code

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package graphic;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

/**
 *
 * @author nisansala
 */
public class grapix extends javax.swing.JFrame {

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

    @Override
     public void paint(Graphics g) {
     Graphics2D ga = (Graphics2D)g;
     ga.setPaint(Color.red);
     ga.drawLine(200,100,200,300);


  }

    /**
     * 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() {

        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("paint");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(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()
                .addGap(153, 153, 153)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(153, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(108, 108, 108)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(149, Short.MAX_VALUE))
        );

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

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        Graphics gg = null;
        // TODO add your handling code here:
//       grap(gg);

    }                                        

    /**
     * @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(grapix.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(grapix.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(grapix.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(grapix.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 grapix().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    // End of variables declaration                   
}

回答1:


Here is an example to help you:

enter image description here

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author David
 */
public class Test {

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Frame");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        final LinePanel linePanel = new LinePanel();

        JPanel buttonPanel = new JPanel();
        JButton buttonDrawRandomLine = new JButton("Draw Random Line");

        final Random rand = new Random();
        buttonDrawRandomLine.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Line2D line = new Line2D.Double(rand.nextInt(200), rand.nextInt(200), rand.nextInt(200), rand.nextInt(200));
                linePanel.addLine(line);
            }
        });

        buttonPanel.add(buttonDrawRandomLine);

        frame.add(buttonPanel, BorderLayout.SOUTH);

        frame.add(linePanel, BorderLayout.CENTER);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

class LinePanel extends JPanel {

    ArrayList<Line2D> lines = new ArrayList<>();

    public void addLine(Line2D l) {
        lines.add(l);
        repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        for (Line2D l : lines) {
            g2d.draw(l);
        }

    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 300);
    }
}

1) I would not suggest learning Swing via Netbeans Drag and Drop, first do it by hand, than use the Drag and drop to make your life easier once you understand how things work.

2) Do not extend a JFrame (for OOP best practice) we dont extend classes unless we are adding functionality to them which they do not already support

3) Dont override paint of JFrame unless absolutely necessary rather use JComponent like JPanel and override paintComponent




回答2:


Problem: You have no event code in your button event handler.

  1. Try creating a state variable called boolean showLine before your constructor.
  2. Initialize it to false in constructor.
  3. Modify state variable on button click.

    private void jButton1ActionPerformed(
                    java.awt.event.ActionEvent evt) {                                         
    Graphics gg = null;
    // TODO add your handling code here:
    showLine = (true) ? false : true;
    

    }

  4. Add condition checking to paint method.

    @Override public void paint(Graphics g) { Graphics2D ga = (Graphics2D)g;

    if (showLine) {
        ga.setPaint(Color.red);
        ga.drawLine(200,100,200,300);
    }
    

    }




回答3:


please add proper methods to be invoked from button listener. Also add panel where you want to draw line. This seems to be a probable duplicate of :-

Drawing a line on a JFrame



来源:https://stackoverflow.com/questions/20313374/confused-with-java-graphics-paint

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!