gpt4 book ai didi

java - 在 JForm java 上绘制形状

转载 作者:行者123 更新时间:2023-11-29 04:34:41 27 4
gpt4 key购买 nike

我创建了这段代码,当我在 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);
}
}

最佳答案

我在您的代码中发现了一些问题:

  1. 您正在扩展 JFrame,您不应该这样做,因为这可以被解读为 DrawShapesGUI 是一个 JFrameJFrame 是一个刚性容器,而不是基于 JPanel 创建您的 GUI。参见 Java Swing using extends vs calling it inside of class了解更多信息。

  2. 您有一个名为 figureID 的成员,但您从未使用过它,因为每次您在每个“ActionPerformed ”方法:

    int figureID = 5;

    从每个句子中删除 int,这可能就是您为什么什么都没有发生的问题。

  3. 您正在覆盖 paint() 方法,您应该覆盖 paintComponent()。不过,我必须祝贺你至少调用了 super.paint(g)

  4. 这完全不是问题,但改进是使用 Shapes API 绘制形状,而不是调用 g.drawLine() 和所有这些调用。

  5. 您正在使用 java.awt.EventQueue.invokeLater(),作为 Java 1.3 版本应该更改为 SwingUtilities.invokeLater()(再次只是一个改进)

  6. 您可以通过其中只有一个方法和条件的更好方式改进您的 ActionListener


考虑到以上几点,我制作了这个生成此输出的新程序:

enter image description here

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);
}
}

关于java - 在 JForm java 上绘制形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42158156/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com