JAVA Jform是什么_在JForm Java上绘制形状

本文介绍如何在Java Swing的JForm组件上绘制各种形状,包括线条、矩形、椭圆、弧形和多边形。通过示例代码展示了如何响应用户选择并动态更新画布,同时建议避免在JFrame上直接绘图,而是使用JPanels和自定义组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小编典典

我在您的代码中看到了一些问题:

您正在扩展JFrame,您不应该这样做,因为可以将其读DrawShapesGUI 为a JFrame,JFrame是一个刚性容器,而是基于JPanels创建您的GUI 。有关更多信息,请参见使用Exting vs在类内部调用Java Swing。

您有一个称为的成员,figureID但您从未使用过它,因为每次figureID在每个“ ActionPerformed”方法中创建一个新的局部变量时:

int figureID = 5;

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

您正在覆盖paint()方法,而应该覆盖paintComponent()。但是,我必须祝贺你至少打来电话super.paint(g)。

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

您正在使用java.awt.EventQueue.invokeLater()应将Java 1.3版本更改为SwingUtilities.invokeLater()(再次改进)

ActionListener仅使用其中的一种方法和条件,就可以以更好的方式改进s。

考虑到以上几点,我制作了一个新程序,该程序产生以下输出:

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

}

}

2020-11-01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值