问题
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:
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.
- Try creating a state variable called boolean showLine before your constructor.
- Initialize it to false in constructor.
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;
}
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