在Swing里面的BufferedImage中绘画

我正在研究用java编写的绘图应用程序并遇到一些(更多)问题。 我有一个gui和一个工作程序(有点),我唯一的问题是用户绘制的线条和图形不会被保存(在绘制下一个之后消失)。

从过去的问题我了解到,我将需要使用BufferedImage来存储图形,然后在我的paint类中绘制它。

我的问题是,任何人都可以提供如何使用bufferedimage来存储和绘制绘图的基本解释/示例,如果需要,我将如何将绘制线的颜色和粗细传递到存储的数组中。

那就是全class同学。

package javapaint; import java.awt.*; import javax.swing.*; public class JavaPaintUI extends javax.swing.JFrame { /** Creates new form JavaPaintUI */ public JavaPaintUI() { initComponents(); } //  private void initComponents() { buttonGroup1 = new javax.swing.ButtonGroup(); buttonGroup2 = new javax.swing.ButtonGroup(); jPanel4 = new javax.swing.JPanel(); jRadioButton9 = new javax.swing.JRadioButton(); jRadioButton10 = new javax.swing.JRadioButton(); jSlider2 = new javax.swing.JSlider(); jLabel1 = new javax.swing.JLabel(); jPanel2 = new Panel2(); jPanel3 = new javax.swing.JPanel(); jRadioButton3 = new javax.swing.JRadioButton(); jRadioButton4 = new javax.swing.JRadioButton(); jRadioButton5 = new javax.swing.JRadioButton(); jRadioButton6 = new javax.swing.JRadioButton(); jRadioButton7 = new javax.swing.JRadioButton(); jRadioButton8 = new javax.swing.JRadioButton(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("JavaPaint ~ Nick R"); jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Tool")); buttonGroup1.add(jRadioButton9); jRadioButton9.setText("Pen"); jRadioButton9.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton9ActionPerformed(evt); } }); buttonGroup1.add(jRadioButton10); jRadioButton10.setText("Line"); jRadioButton10.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton10ActionPerformed(evt); } }); jSlider2.setMajorTickSpacing(10); jSlider2.setMaximum(51); jSlider2.setMinimum(1); jSlider2.setMinorTickSpacing(5); jSlider2.setPaintTicks(true); jSlider2.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { jSlider2StateChanged(evt); } }); jLabel1.setText("Stroke Size (Radius)"); javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); jPanel4.setLayout(jPanel4Layout); jPanel4Layout.setHorizontalGroup( jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jRadioButton9) .addComponent(jRadioButton10)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 51, Short.MAX_VALUE) .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabel1) .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); jPanel4Layout.setVerticalGroup( jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(jPanel4Layout.createSequentialGroup() .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jRadioButton9) .addComponent(jLabel1)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jRadioButton10))) ); jPanel2.setBackground(new java.awt.Color(255, 255, 255)); jPanel2.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); jPanel2.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { jPanel2MousePressed(evt); } public void mouseReleased(java.awt.event.MouseEvent evt) { jPanel2MouseReleased(evt); } }); jPanel2.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseDragged(java.awt.event.MouseEvent evt) { jPanel2MouseDragged(evt); } }); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 596, Short.MAX_VALUE) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 357, Short.MAX_VALUE) ); jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Color")); buttonGroup2.add(jRadioButton3); jRadioButton3.setText("Red"); jRadioButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton3ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton4); jRadioButton4.setText("Black"); jRadioButton4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton4ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton5); jRadioButton5.setText("Gray"); jRadioButton5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton5ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton6); jRadioButton6.setText("Green"); jRadioButton6.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton6ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton7); jRadioButton7.setText("White"); jRadioButton7.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton7ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton8); jRadioButton8.setText("Blue"); jRadioButton8.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton8ActionPerformed(evt); } }); javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jRadioButton3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jRadioButton4, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 66, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jRadioButton5, javax.swing.GroupLayout.DEFAULT_SIZE, 55, Short.MAX_VALUE) .addComponent(jRadioButton6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(jRadioButton8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jRadioButton7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jRadioButton4) .addComponent(jRadioButton5) .addComponent(jRadioButton7)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 3, Short.MAX_VALUE) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jRadioButton3) .addComponent(jRadioButton6) .addComponent(jRadioButton8))) ); jButton1.setText("Clear"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jButton2.setText("About"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(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() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 112, Short.MAX_VALUE) .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 112, Short.MAX_VALUE)))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addGap(4, 4, 4) .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); pack(); }//  private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { System.out.println("You cleared the canvas."); } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { JOptionPane.showMessageDialog(null, "JavaPaint is a simple java based painting application." + " Nick R 5/22/2011", "About", JOptionPane.INFORMATION_MESSAGE); } int currentX, currentY, oldX, oldY; private void jPanel2MouseDragged(java.awt.event.MouseEvent evt) { currentX = evt.getX(); currentY = evt.getY(); repaint(); if (tool == 1) { oldX = currentX; oldY = currentY; System.out.println("Using pen at " + currentX + ", " + currentY); } } private void jPanel2MousePressed(java.awt.event.MouseEvent evt) { oldX = evt.getX(); oldY = evt.getY(); if (tool == 2) { currentX = oldX; currentY = oldY; } } //Tool Selection// int tool = 0; private void jRadioButton9ActionPerformed(java.awt.event.ActionEvent evt) { tool = 1; System.out.println("Using the pen tool."); } private void jRadioButton10ActionPerformed(java.awt.event.ActionEvent evt) { tool = 2; System.out.println("Using the line tool."); } //Slider Properties// double value = 5; private void jSlider2StateChanged(javax.swing.event.ChangeEvent evt) { value = jSlider2.getValue(); System.out.println(value); } //COLOR CODE// int color = 1; private void jRadioButton4ActionPerformed(java.awt.event.ActionEvent evt) { color = 1; // Black } private void jRadioButton5ActionPerformed(java.awt.event.ActionEvent evt) { color = 2; // Grey } private void jRadioButton7ActionPerformed(java.awt.event.ActionEvent evt) { color = 3; // White } private void jRadioButton3ActionPerformed(java.awt.event.ActionEvent evt) { color = 4; // Red } private void jRadioButton6ActionPerformed(java.awt.event.ActionEvent evt) { color = 5; // Green } private void jRadioButton8ActionPerformed(java.awt.event.ActionEvent evt) { color = 6; // Blue } //mouse released// private void jPanel2MouseReleased(java.awt.event.MouseEvent evt) { currentX = evt.getX(); currentY = evt.getY(); if (tool == 2) { System.out.println("line from " + oldX +", "+ oldY + " to " + currentX + ", " + currentY); } } //set ui visible// public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new JavaPaintUI().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.ButtonGroup buttonGroup1; private javax.swing.ButtonGroup buttonGroup2; private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; public javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JRadioButton jRadioButton10; private javax.swing.JRadioButton jRadioButton3; private javax.swing.JRadioButton jRadioButton4; private javax.swing.JRadioButton jRadioButton5; private javax.swing.JRadioButton jRadioButton6; private javax.swing.JRadioButton jRadioButton7; private javax.swing.JRadioButton jRadioButton8; private javax.swing.JRadioButton jRadioButton9; public javax.swing.JSlider jSlider2; // End of variables declaration class Panel2 extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); if(color==1) g2.setPaint( Color.black ); else if(color==2) g2.setPaint( Color.gray); else if(color==3) g2.setPaint( Color.white ); else if(color==4) g2.setPaint( Color.red ); else if(color==5) g2.setPaint( Color.green ); else if(color==6) g2.setPaint( Color.blue ); if (tool == 1) { g2.fillOval(currentX - ((int) value / 2), currentY - ((int) value / 2), (int) value, (int) value); } else if (tool == 2) { g2.setStroke(new BasicStroke((float) value, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); g2.drawLine(oldX, oldY, currentX, currentY); g2.setStroke(new BasicStroke(1.0f)); } } } } 

谢谢!

好的 – 这里有一些改动。

 import java.awt.*; import java.awt.image.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class JavaPaintUI extends JFrame { private BufferedImage canvas; /** Creates new form JavaPaintUI */ public JavaPaintUI() { initComponents(); } //this was moved from the overriden paintComponent() // instead it update the canvas BufferedImage and calls repaint() public void updateCanvas() { Graphics2D g2d = canvas.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); g2d.setPaint( getColor() ); if (tool == 1) { g2d.fillOval(currentX - ((int) value / 2), currentY - ((int) value / 2), (int) value, (int) value); } else if (tool == 2) { g2d.setStroke(new BasicStroke((float) value, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); g2d.drawLine(oldX, oldY, currentX, currentY); g2d.setStroke(new BasicStroke(1.0f)); } repaint(); } // used in both the updateCanvas and 'clear' method. private Color getColor() { Color c = null; if(color==1) c = Color.black; else if(color==2) c = Color.gray; else if(color==3) c = Color.white; else if(color==4) c = Color.red; else if(color==5) c = Color.green; else if(color==6) c = Color.blue; return c; } //  private void initComponents() { canvas = new BufferedImage(600,400,BufferedImage.TYPE_INT_RGB); buttonGroup1 = new ButtonGroup(); buttonGroup2 = new ButtonGroup(); jPanel4 = new JPanel(); jRadioButton9 = new JRadioButton(); jRadioButton10 = new JRadioButton(); jSlider2 = new JSlider(); jLabel1 = new JLabel(); jPanel2 = new JPanel(new GridBagLayout()); JLabel canvasLabel = new JLabel(new ImageIcon(canvas)); jPanel2.add(canvasLabel, null); jPanel3 = new JPanel(); jRadioButton3 = new JRadioButton(); jRadioButton4 = new JRadioButton(); jRadioButton5 = new JRadioButton(); jRadioButton6 = new JRadioButton(); jRadioButton7 = new JRadioButton(); jRadioButton8 = new JRadioButton(); jButton1 = new JButton(); jButton2 = new JButton(); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setTitle("JavaPaint ~ Nick R"); jPanel4.setBorder(BorderFactory.createTitledBorder("Tool")); buttonGroup1.add(jRadioButton9); jRadioButton9.setText("Pen"); jRadioButton9.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jRadioButton9ActionPerformed(evt); } }); buttonGroup1.add(jRadioButton10); jRadioButton10.setText("Line"); jRadioButton10.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jRadioButton10ActionPerformed(evt); } }); jSlider2.setMajorTickSpacing(10); jSlider2.setMaximum(51); jSlider2.setMinimum(1); jSlider2.setMinorTickSpacing(5); jSlider2.setPaintTicks(true); jSlider2.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { jSlider2StateChanged(evt); } }); jLabel1.setText("Stroke Size (Radius)"); GroupLayout jPanel4Layout = new GroupLayout(jPanel4); jPanel4.setLayout(jPanel4Layout); jPanel4Layout.setHorizontalGroup( jPanel4Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel4Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(jRadioButton9) .addComponent(jRadioButton10)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 51, Short.MAX_VALUE) .addGroup(jPanel4Layout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(jLabel1) .addComponent(jSlider2, GroupLayout.PREFERRED_SIZE, 150, GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); jPanel4Layout.setVerticalGroup( jPanel4Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(jSlider2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addGroup(jPanel4Layout.createSequentialGroup() .addGroup(jPanel4Layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(jRadioButton9) .addComponent(jLabel1)) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jRadioButton10))) ); jPanel2.setBackground(new Color(128, 40, 128)); jPanel2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); // add the listeners to the label that contains the canvas buffered image canvasLabel.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent evt) { jPanel2MousePressed(evt); } public void mouseReleased(MouseEvent evt) { jPanel2MouseReleased(evt); } }); canvasLabel.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent evt) { jPanel2MouseDragged(evt); } }); // this part of the code was not helping. // either layout a container or custom paint it. // only attempt both if you are very confident of what you are doing. /* GroupLayout jPanel2Layout = new GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGap(0, 596, Short.MAX_VALUE) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGap(0, 357, Short.MAX_VALUE) ); */ jPanel3.setBorder(BorderFactory.createTitledBorder("Color")); buttonGroup2.add(jRadioButton3); jRadioButton3.setText("Red"); jRadioButton3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jRadioButton3ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton4); jRadioButton4.setText("Black"); jRadioButton4.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jRadioButton4ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton5); jRadioButton5.setText("Gray"); jRadioButton5.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jRadioButton5ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton6); jRadioButton6.setText("Green"); jRadioButton6.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jRadioButton6ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton7); jRadioButton7.setText("White"); jRadioButton7.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jRadioButton7ActionPerformed(evt); } }); buttonGroup2.add(jRadioButton8); jRadioButton8.setText("Blue"); jRadioButton8.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jRadioButton8ActionPerformed(evt); } }); GroupLayout jPanel3Layout = new GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel3Layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(jRadioButton3, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jRadioButton4, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 66, Short.MAX_VALUE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel3Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(jRadioButton5, GroupLayout.DEFAULT_SIZE, 55, Short.MAX_VALUE) .addComponent(jRadioButton6, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel3Layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false) .addComponent(jRadioButton8, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jRadioButton7, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() .addGroup(jPanel3Layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(jRadioButton4) .addComponent(jRadioButton5) .addComponent(jRadioButton7)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 3, Short.MAX_VALUE) .addGroup(jPanel3Layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(jRadioButton3) .addComponent(jRadioButton6) .addComponent(jRadioButton8))) ); jButton1.setText("Clear"); jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jButton1ActionPerformed(evt); } }); jButton2.setText("About"); jButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { jButton2ActionPerformed(evt); } }); GroupLayout layout = new GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(jPanel2, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jPanel4, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jPanel3, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(jButton2, GroupLayout.DEFAULT_SIZE, 112, Short.MAX_VALUE) .addComponent(jButton1, GroupLayout.DEFAULT_SIZE, 112, Short.MAX_VALUE)))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addGap(4, 4, 4) .addComponent(jButton1, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton2, GroupLayout.PREFERRED_SIZE, 28, GroupLayout.PREFERRED_SIZE)) .addComponent(jPanel4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); pack(); }//  // clear the canvas using the currently selected color. private void jButton1ActionPerformed(ActionEvent evt) { System.out.println("You cleared the canvas."); Graphics g = canvas.getGraphics(); g.setColor( getColor() ); g.fillRect(0,0,canvas.getWidth(),canvas.getHeight()); repaint(); } private void jButton2ActionPerformed(ActionEvent evt) { JOptionPane.showMessageDialog(null, "JavaPaint is a simple java based painting application." + " Nick R 5/22/2011", "About", JOptionPane.INFORMATION_MESSAGE); } int currentX, currentY, oldX, oldY; private void jPanel2MouseDragged(MouseEvent evt) { currentX = evt.getX(); currentY = evt.getY(); updateCanvas(); if (tool == 1) { oldX = currentX; oldY = currentY; System.out.println("Using pen at " + currentX + ", " + currentY); } } private void jPanel2MousePressed(MouseEvent evt) { oldX = evt.getX(); oldY = evt.getY(); if (tool == 2) { currentX = oldX; currentY = oldY; } } //Tool Selection// int tool = 0; private void jRadioButton9ActionPerformed(ActionEvent evt) { tool = 1; System.out.println("Using the pen tool."); } private void jRadioButton10ActionPerformed(ActionEvent evt) { tool = 2; System.out.println("Using the line tool."); } //Slider Properties// double value = 5; private void jSlider2StateChanged(ChangeEvent evt) { value = jSlider2.getValue(); System.out.println(value); } //COLOR CODE// int color = 1; private void jRadioButton4ActionPerformed(ActionEvent evt) { color = 1; // Black } private void jRadioButton5ActionPerformed(ActionEvent evt) { color = 2; // Grey } private void jRadioButton7ActionPerformed(ActionEvent evt) { color = 3; // White } private void jRadioButton3ActionPerformed(ActionEvent evt) { color = 4; // Red } private void jRadioButton6ActionPerformed(ActionEvent evt) { color = 5; // Green } private void jRadioButton8ActionPerformed(ActionEvent evt) { color = 6; // Blue } //mouse released// private void jPanel2MouseReleased(MouseEvent evt) { currentX = evt.getX(); currentY = evt.getY(); if (tool == 2) { System.out.println("line from " + oldX +", "+ oldY + " to " + currentX + ", " + currentY); } } //set ui visible// public static void main(String args[]) { EventQueue.invokeLater(new Runnable() { public void run() { new JavaPaintUI().setVisible(true); } }); } // Variables declaration - do not modify private ButtonGroup buttonGroup1; private ButtonGroup buttonGroup2; private JButton jButton1; private JButton jButton2; private JLabel jLabel1; public JPanel jPanel2; private JPanel jPanel3; private JPanel jPanel4; private JRadioButton jRadioButton10; private JRadioButton jRadioButton3; private JRadioButton jRadioButton4; private JRadioButton jRadioButton5; private JRadioButton jRadioButton6; private JRadioButton jRadioButton7; private JRadioButton jRadioButton8; private JRadioButton jRadioButton9; public JSlider jSlider2; // End of variables declaration } 

屏幕截图

在此处输入图像描述

绘制到缓冲区就像在paintComponent(Graphics g)中绘制一样。 区别在于你:

1)首先从任何组件(例如Panel)创建缓冲区:

 Image image = panel.createImage(width, height); 

2)获取图像的图形上下文:

 Graphics g = image.getGraphics(); 

3)最后完成绘制到缓冲区时:

 g.dispose(); 

稍后,将图像绘制到组件上:

 void paintComponent(Graphics g) { g.drawImage(image, x_offset, y_offset, null); }