我正在制作一個創建凸多邊形的應用程式。
我想象它是這樣的,所以我首先設定多邊形的頂點然后創建它。
我能夠添加點(頂點)。現在我需要幫助將點與線連接起來。
這就是它的樣子:

這是帶有四個點的 GUI

這是帶有多邊形的 GUI

我沒有顯示它,但重置按鈕會清除繪圖區域。
解釋
當我創建一個 Swing GUI 時,我使用模型-視圖-控制器模式。這種模式使我能夠分離我的關注點并一次專注于 Swing 應用程式的一個部分。
Swing 應用程式模型由一個或多個普通的 Java getter/setter 類組成。
Swing 視圖由一個JFrame和一個或多個組成JPanels。
Swing 控制器是附加到JButtons并繪制的偵聽器JPanels。
模型
對于這個應用程式,我創建了一個PolygonModel類。該類包含一個boolean告訴我是否要繪制多邊形和實體java.util.List的a。java.awt.Point該類Point包含一個 X 和 Yint值。
看法
所有 Swing 應用程式都必須以呼叫該SwingUtilities invokeLater方法開始。此方法確保在Event Dispatch Thread上創建和執行 Swing 組件。
我把你的main方法分成了幾個方法。我將 的創建JFrame與JPanels. 這使我能夠分離我的關注點并一次專注于 GUI 的一個部分。
JFrame必須按特定順序呼叫這些方法。這是我用于大多數 Swing 應用程式的順序。
我更改了您的PadDraw課程以擴展JPanel. 我將MouseAdapter代碼移到了它自己的類中。您的繪圖面板應該繪制。時期。沒有其他的。
該paintComponent方法總是以對該super.paintComponent方法的呼叫開始。這會維護 Swing 繪制鏈并有助于消除不需要的繪圖偽影。
JPanel每次重繪之前,繪圖都會被清除。因此,您每次都必須完全重繪影像。這就是我們將List實體Point存盤在模型中的原因。
控制器
我創建了三個控制器類。
類PointListener擴展MouseAdapter。mousePressed請注意該方法在應用程式模型中變得多么簡單。
兩者JButtons各有各的ActionListener。因為它們很簡單,所以我把它們都做成了 lambdas。
代碼
這是完整的可運行代碼。我將所有附加類都設為內部類,這樣我就可以將它們公開并將代碼作為一個塊發布。
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EtchedBorder;
public class PolygonImage implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new PolygonImage());
}
private final PolygonModel model;
private final PadDraw drawPad;
public PolygonImage() {
this.model = new PolygonModel();
this.drawPad = new PadDraw(this, model);
}
@Override
public void run() {
JFrame frame = new JFrame("Draw Polygon");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(drawPad, BorderLayout.CENTER);
frame.add(createButtonPanel(), BorderLayout.SOUTH);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createButtonPanel() {
JPanel buttonPanel = new JPanel();
buttonPanel
.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
JButton buttonDrawPolygon = new JButton("Draw Polygon");
buttonDrawPolygon.addActionListener(event -> {
model.setConnectPoints(true);
repaint();
});
buttonPanel.add(buttonDrawPolygon);
JButton buttonReset = new JButton("Reset");
buttonReset.addActionListener(event -> {
model.setConnectPoints(false);
model.clearList();
repaint();
});
buttonPanel.add(buttonReset);
return buttonPanel;
}
public void repaint() {
drawPad.repaint();
}
public class PadDraw extends JPanel {
private static final long serialVersionUID = 1L;
private final PolygonModel model;
public PadDraw(PolygonImage view, PolygonModel model) {
this.model = model;
this.addMouseListener(new PointListener(view, model));
this.setPreferredSize(new Dimension(450, 300));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.black);
// Draw points
for (Point p : model.getPoints()) {
int radius = 6;
int diameter = radius radius;
g2d.fillOval(p.x - radius, p.y - radius, diameter, diameter);
}
// Draw polygon
if (model.isConnectPoints()) {
g2d.setStroke(new BasicStroke(5));
List<Point> points = model.getPoints();
if (points.size() >= 1) {
Point old = points.get(0);
for (int index = 1; index < points.size(); index ) {
Point p = points.get(index);
g2d.drawLine(old.x, old.y, p.x, p.y);
old = p;
}
Point p = points.get(0);
g2d.drawLine(p.x, p.y, old.x, old.y);
}
}
}
}
public class PointListener extends MouseAdapter {
private final PolygonImage view;
private final PolygonModel model;
public PointListener(PolygonImage view, PolygonModel model) {
this.view = view;
this.model = model;
}
@Override
public void mousePressed(MouseEvent event) {
model.addPoint(event.getPoint());
view.repaint();
}
}
public class PolygonModel {
private boolean connectPoints;
private final List<Point> points;
public PolygonModel() {
this.points = new ArrayList<>();
this.connectPoints = false;
}
public void setConnectPoints(boolean connectPoints) {
this.connectPoints = connectPoints;
}
public boolean isConnectPoints() {
return connectPoints;
}
public void clearList() {
this.points.clear();
}
public void addPoint(Point point) {
this.points.add(point);
}
public List<Point> getPoints() {
return points;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/516707.html
