[英]Draw new graphics components (ie circles) when event happens
我正在開發一個非常簡單的程序。 我想做的是,在按下firstButton時添加了一個新的圓圈(程序在確保事件正常運行之后是當前狀態)。
我知道我需要在某個地方使用paintComponent
方法,並且可能需要使用repaint
但不確定如何將它們放入。
感謝您的幫助,謝謝:
public class aGameForBella extends JPanel {
private int count1 = 0, count2 = 0, count3 = 0;
JButton firstButton, secondButton, thirdButton;
JLabel firstLabel, secondLabel, thirdLabel;
JPanel optionPanel;
//constructor method
public aGameForBella() {
//create components
optionPanel = new JPanel();
firstButton = new JButton("Button option number one");
firstLabel = new JLabel("You pushed the first button: " + count1
+ " times");
secondButton = new JButton("Button option number two");
secondLabel = new JLabel("You pushed the second button: " + count2
+ " times");
thirdButton = new JButton("Button option number three");
thirdLabel = new JLabel("You pushed the third button: " + count3
+ " times");
//add listeners
firstButton.addActionListener(new ButtonListener());
secondButton.addActionListener(new ButtonListener());
thirdButton.addActionListener(new ButtonListener());
//add panels
add(optionPanel);
//add components to panels
optionPanel.add(firstButton);
optionPanel.add(firstLabel);
optionPanel.add(secondButton);
optionPanel.add(secondLabel);
optionPanel.add(thirdButton);
optionPanel.add(thirdLabel);
//set size of things
optionPanel.setPreferredSize(new Dimension(200, 200));
setPreferredSize(new Dimension(250, 500));
setBackground(Color.cyan);
}
//inner class
private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == firstButton) {
count1++;
firstLabel.setText("You pushed the first button: " + count1
+ " times");
} else if (event.getSource() == secondButton) {
count2++;
secondLabel.setText("And you pushed the second button: "
+ count2 + " times");
} else if (event.getSource() == thirdButton) {
count3++;
thirdLabel.setText("And the last button: " + count3 + " times");
}
}
}
}
根據您的需求將取決於您的整體方法。
例如,如果您要維護所繪制的內容,則需要生成一個包含所有所需值的列表,以便在重新繪制組件時重現輸出。
下面的示例基本上包含一個基於Shape
的對象列表,並在每次繪制組件時重新繪制它們。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class DrawCircles {
public static void main(String[] args) {
new DrawCircles();
}
public DrawCircles() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final CirclePane circlePane = new CirclePane();
JButton btn = new JButton("Click");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
circlePane.addCircle();
}
});
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(circlePane);
frame.add(btn, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class CirclePane extends JPanel {
private List<Shape> circles;
public CirclePane() {
circles = new ArrayList<>(25);
}
public void addCircle() {
int width = getWidth() - 1;
int height = getHeight() - 1;
int radius = (int) Math.round(Math.random() * (Math.min(width, height) / 4f));
int x = (int) Math.round(Math.random() * getWidth());
int y = (int) Math.round(Math.random() * getHeight());
if (x + radius > width) {
x = width - radius;
}
if (y + radius > height) {
y = height - radius;
}
circles.add(new Ellipse2D.Float(x, y, radius, radius));
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int width = getWidth() - 1;
int height = getHeight() - 1;
for (Shape shape : circles) {
g2d.draw(shape);
}
g2d.dispose();
}
}
}
“定制繪畫方法”顯示了兩種執行定制繪畫的標准方法。 第一個是從List繪制,第二個是在BufferedImage上繪制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.