[英]How can you draw rectangles on a JPanel?
我正在嘗試創建一個使用 slider 生成矩形的程序。 用戶應該能夠移動 slider 並且矩形應該出現在 JPanel 上 slider 上方的隨機位置。 我已經嘗試運行該程序,但仍然無法顯示任何內容,我移動了 slider 但屏幕上沒有出現任何內容。 我曾嘗試使用書中的示例編寫此程序,但在實際繪制矩形時我卡住了。 我能夠創建和更改布局以及顯示 slider 和一些標簽,但我無法讓矩形出現在 JPanel 上。 這是我的代碼:
import java.util.*;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JLabel;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Dimension;
import java.lang.Object;
public class RectangleFrame extends JFrame
{
private static final int FRAME_WIDTH = 600;
private static final int FRAME_HEIGHT = 500;
private JPanel RectanglePanel;
private JSlider RectangleSlider;
int x = 0;
int y = 0;
/**Creates a new Rectangle frame objects.
Creates control panel and sets the size.*/
public RectangleFrame()
{
RectanglePanel = new JPanel();
RectanglePanel.setPreferredSize(new Dimension(600, 300));
add(RectanglePanel, BorderLayout.CENTER);
createControlPanel();
setRectangles();
setSize(FRAME_WIDTH,FRAME_HEIGHT);
}
class RectangleListener implements ChangeListener
{
public void stateChanged(ChangeEvent event)
{
setRectangles();
}
}
/**Creates the Panel where the user can slide and generate rectangles. */
public void createControlPanel()
{
ChangeListener listener = new RectangleListener();
RectangleSlider = new JSlider(JSlider.HORIZONTAL, 1, 20, 1);
RectangleSlider.addChangeListener(listener);
JPanel controlPanel = new JPanel();
controlPanel.setLayout(new GridLayout(1,3));
controlPanel.add(new JLabel("Fewer"));
controlPanel.add(RectangleSlider);
controlPanel.add(new JLabel("More"));
add(controlPanel, BorderLayout.SOUTH);
}
public void setRectangles()
{
Random random = new Random();
//Read slider value
int numberOfRectangles = RectangleSlider.getValue();
for(int i = 0; i < numberOfRectangles; i++)
{
x = random.nextInt(540);
y = random.nextInt(290);
}
}
protected void paintComponent(Graphics g)
{
super.paintComponents(g);
g.setColor(Color.BLACK);
g.drawRect(x, y, 60, 10);
}
}
我嘗試過繪制一個簡單的矩形,但 JPanel 上什至沒有出現,更不用說多個了。 任何進一步研究此問題的資源也將受到高度贊賞。
您不能直接在 JFrame 上繪圖。 對於“自定義繪畫” (稱為),您需要創建一個覆蓋paintComponent
方法的組件的子類。 例如一個JPanel:
class RectanglePanel extends JPanel {
int numberOfRectangles = 2;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
Random random = new Random(42);
for (int i = 0; i < numberOfRectangles; i++) {
x = random.nextInt(540);
y = random.nextInt(290);
g.drawRect(x, y, 60, 10);
}
}
}
您可以像使用 JPanel 一樣使用此自定義組件:
rectanglePanel = new RectanglePanel();
rectanglePanel.setPreferredSize(new Dimension(600, 300));
add(rectanglePanel, BorderLayout.CENTER);
要繪制更少或更多的矩形,您可以做的最簡單的事情是更改自定義組件的numberOfRectangles
,然后要求它重新繪制自己。
int numberOfRectangles = RectangleSlider.getValue();
rectanglePanel.numberOfRectangles = numberOfRectangles;
rectanglePanel.repaint();
請注意,這是一個簡化的演示,並未演示封裝等“良好實踐”。 更高級的技術是使用 model-view-controller 模式,並創建一個“模型” object 來封裝應該繪制的內容。 您可以在此處閱讀有關其工作原理的更多信息: MVC 模式和 Swing
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.