[英]Drawing shapes on a JForm java
我創建了這個代碼,當我在JForm上選擇一個單選按鈕時,它應該繪制某些東西,我已經使用NetBeans來創建GUI。 當我選擇單選按鈕時沒有任何反應。 我一直試圖弄清楚什么是錯的,但我仍然無法找到解決方案,這就是我來到這里的原因。 如果有人能發現錯誤,我會感激不盡。
public class DrawShapesGUI extends javax.swing.JFrame {
private int figureID;
public DrawShapesGUI() {
initComponents();
repaint();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code"></editor-fold>
private void lineButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 1;
repaint();
}
private void rectButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 2;
repaint();
}
private void ovalButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 3;
repaint();
}
private void arcButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 4;
repaint();
}
private void polygonButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 5;
repaint();
}
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(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.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 DrawShapesGUI().setVisible(true);
}
});
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
if (figureID == 1) {
g.drawLine(50, 50, 100, 100);
} else if (figureID == 2) {
g.fillRect(50, 50, 100, 100);
} else if (figureID == 3) {
g.fillOval(100, 100, 100, 60);
} else if (figureID == 4) {
g.drawArc(50, 50, 200, 200, 90, 30);
} else if (figureID == 5) {
Polygon poly = new Polygon();
poly.addPoint(100, 50);
poly.addPoint(150, 50);
poly.addPoint(200, 100);
poly.addPoint(150, 150);
poly.addPoint(100, 150);
poly.addPoint(50, 100);
g.fillPolygon(poly);
}
}
我在你的代碼中看到了一些問題:
你正在擴展JFrame
,你不應該這樣做,因為這可以讀取,就像DrawShapesGUI
是一個 JFrame
, JFrame
是一個剛性容器,而是基於JPanel
創建你的GUI。 有關更多信息,請參閱Java Swing使用extends vs在類內部調用它 。
你有一個名為figureID
的成員,但你永遠不會使用它,因為每次在每個“ ActionPerformed
”方法中創建一個新的局部變量figureID
:
int figureID = 5;
從每個句子中刪除int
,可能這就是為什么沒有發生任何事情的問題。
你重寫了paint()
方法,你應該重寫paintComponent()
。 但是我必須祝賀你至少要打電話給super.paint(g)
。
根本不是問題,但改進是使用Shapes API繪制形狀而不是調用g.drawLine()
和所有這些調用。
您正在使用java.awt.EventQueue.invokeLater()
,因為Java的1.3版應該更改為SwingUtilities.invokeLater()
(再次只是一個改進)
只需一個方法和條件,您就可以更好地改進ActionListener
。
考慮到以上幾點,我制作了這個產生這個輸出的新程序:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class DrawShapesGUI {
private JFrame frame;
private JRadioButton lineButton;
private JRadioButton rectButton;
private JRadioButton ovalButton;
private JRadioButton arcButton;
private JRadioButton polygonButton;
private ButtonGroup group;
private JPanel pane;
private CustomShape renderShape;
private Shape shape;
private ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(lineButton)) {
shape = new Line2D.Double(50, 50, 100, 100);
renderShape.setShape(shape);
} else if (e.getSource().equals(rectButton)) {
shape = new Rectangle2D.Double(50, 50, 100, 100);
renderShape.setShape(shape);
} else if (e.getSource().equals(ovalButton)) {
shape = new Ellipse2D.Double(100, 100, 100, 60);
renderShape.setShape(shape);
} else if (e.getSource().equals(arcButton)) {
shape = new Arc2D.Double(50, 50, 200, 200, 90, 30, Arc2D.OPEN);
renderShape.setShape(shape);
} else if (e.getSource().equals(polygonButton)) {
Polygon poly = new Polygon();
poly.addPoint(100, 50);
poly.addPoint(150, 50);
poly.addPoint(200, 100);
poly.addPoint(150, 150);
poly.addPoint(100, 150);
poly.addPoint(50, 100);
shape = poly;
renderShape.setShape(shape);
}
}
};
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(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null,
ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null,
ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null,
ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null,
ex);
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DrawShapesGUI().createAndShowGUI();
}
});
}
class CustomShape extends JPanel {
private Shape shape;
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
revalidate();
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
if (shape != null) {
g2d.setColor(Color.RED);
if (shape instanceof Line2D || shape instanceof Arc2D) {
g2d.draw(shape);
} else {
g2d.fill(shape);
}
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(150, 200);
}
}
public void createAndShowGUI() {
frame = new JFrame(getClass().getSimpleName());
lineButton = new JRadioButton("Line");
rectButton = new JRadioButton("Rectangle");
ovalButton = new JRadioButton("Oval");
arcButton = new JRadioButton("Arc");
polygonButton = new JRadioButton("Polygon");
lineButton.addActionListener(listener);
rectButton.addActionListener(listener);
ovalButton.addActionListener(listener);
arcButton.addActionListener(listener);
polygonButton.addActionListener(listener);
group = new ButtonGroup();
group.add(lineButton);
group.add(rectButton);
group.add(ovalButton);
group.add(arcButton);
group.add(polygonButton);
pane = new JPanel();
pane.add(lineButton);
pane.add(rectButton);
pane.add(ovalButton);
pane.add(arcButton);
pane.add(polygonButton);
renderShape = new CustomShape();
frame.add(pane, BorderLayout.PAGE_START);
frame.add(renderShape, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.