一旦我按下绘制按钮,我正在尝试使用给定的JTEXTFIELD显示100个字符串,然后在按下旋转按钮时能够将它们全部90度旋转。但是,当我旋转时,一些早期的字符串仍然出现。但是随后整个面板一旦字符串向下指向,整个面板就会清除。为什么这是?
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class RotateAndDraw extends JFrame implements ActionListener{
// Declare all member variables
private JFrame window;
private JButton drawButton;
private JButton rotateButton;
JTextField userInput = new JTextField("Enter text here");
private static JPanel p3 = new JPanel(); // Drawing surface
private static Graphics g = p3.getGraphics(); // Graphics context
private static int[] xArray = new int[100];
private static int[] yArray = new int[100];
private static int[] fontArray = new int[100];
private static float[] colorArray = new float[100];
private static int rotateCount = 0;
private static int theta;
public RotateAndDraw(){
// Declare all components
window = new JFrame("Rotate and Draw");
drawButton = new JButton("Draw");
rotateButton = new JButton("Rotate");
drawButton.addActionListener(this);
rotateButton.addActionListener(this);
JPanel drawingSurface = new JPanel();
JLabel userInputLabel = new JLabel("Text: ");
// Create some containers
JPanel content = new JPanel();
content.setLayout(new GridLayout(3, 1));
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(1, 2));
p1.add(drawButton);
p1.add(rotateButton);
JPanel p2 = new JPanel();
p2.setLayout(new GridLayout(1, 3));
userInputLabel.setHorizontalAlignment(SwingConstants.RIGHT);
p2.add(userInputLabel);
p2.add(userInput);
JLabel nullLabel = new JLabel("");
p2.add(nullLabel);
p3.setBackground(Color.BLACK);
content.add(p1);
content.add(p2);
content.add(p3);
window.add(content);
}
public void run(){
window.setLocation(100, 100);
window.setSize(10000, 10000);
window.setDefaultCloseOperation(EXIT_ON_CLOSE);
window.setVisible(true);
}
private void paintComponent(Graphics g){
// TODO Auto-generated method stub
super.paintComponents(g);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
super.paintComponents(g);
Graphics2D g2 = ( Graphics2D )g;
String message = userInput.getText();
Font font1, font2, font3, font4, font5; // The five fonts.
font1 = new Font("Serif", Font.BOLD, 14);
font2 = new Font("SansSerif", Font.BOLD + Font.ITALIC, 24);
font3 = new Font("Monospaced", Font.PLAIN, 30);
font4 = new Font("Dialog", Font.PLAIN, 36);
font5 = new Font("Serif", Font.ITALIC, 48);
if(e.getSource() == drawButton){
g = p3.getGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, p3.getWidth(), p3.getHeight());
rotateCount = 0;
int width = p3.getWidth();
int height = p3.getHeight();
for (int i = 0; i < 100; i++) {
int fontNum = (int)(5*Math.random()) + 1;
fontArray[i] = fontNum;
switch (fontNum) {
case 1:
g.setFont(font1);
break;
case 2:
g.setFont(font2);
break;
case 3:
g.setFont(font3);
break;
case 4:
g.setFont(font4);
break;
case 5:
g.setFont(font5);
break;
} // end switch
float hue = (float)Math.random();
colorArray[i] = hue;
g.setColor( Color.getHSBColor(hue, 1.0F, 1.0F) );
int x,y;
x = (int)(Math.random()*(width));
y = (int)(Math.random()*(height));
xArray[i] = x;
yArray[i] = y;
// Draw the message.
g.drawString(message,x,y);
} // end for
}// end if
if(e.getSource() == rotateButton){
super.paintComponents(g2);
g2.setColor(Color.BLACK);
g2.fillRect(0, 0, p3.getWidth(), p3.getHeight());
rotateCount++;
if(rotateCount == 4){
rotateCount = 0;
}
switch(rotateCount){
case 0:
theta = 0;
break;
case 1:
theta = 90;
break;
case 2:
theta = 180;
break;
case 3:
theta = 270;
break;
}
for(int i = 0; i < 100; i++){
switch(fontArray[i]){
case 1:
g2.setFont(font1);
break;
case 2:
g2.setFont(font2);
break;
case 3:
g2.setFont(font3);
break;
case 4:
g2.setFont(font4);
break;
case 5:
g2.setFont(font5);
break;
} // end switch
g2.setColor( Color.getHSBColor(colorArray[i], 1.0F, 1.0F) );
AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(theta), xArray[i], yArray[i]);
g2.setTransform(at);
g2.drawString(message, xArray[i], yArray[i]);
g2.transform(new AffineTransform());
}// end for
}
}
}
好吧,它比我预期的要难,但我认为我可以工作: - (
第一个问题是您在Action Performed中执行图形操作(绘图和转换(。您必须在PaintComponent中执行这些操作,因为这是图形环境需要在需要绘制组件时自动执行的方法。
然后,我不得不稍微解决转变。我认为问题是您打电话给g2.settransform(AT(应用新的坐标变换。我在文档上阅读了您不应该的文档:" setTransform方法仅用于恢复原始graphics2d transfor,"
">这是我提出的。希望它有帮助。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
class Tag {
private int x;
private int y;
private int font;
private float color;
private String message;
public Tag(String message, int x, int y, int font, float color) {
this.message = message;
this.x = x;
this.y = y;
this.font = font;
this.color = color;
}
public String getMessage() {
return message;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getFont() {
return font;
}
public float getColor() {
return color;
}
}
class Board extends JPanel {
private Font[] font = new Font[5];
private Tag[] tags;
private int theta;
public Board() {
font[0] = new Font("Serif", Font.BOLD, 14);
font[1] = new Font("SansSerif", Font.BOLD + Font.ITALIC, 24);
font[2] = new Font("Monospaced", Font.PLAIN, 30);
font[3] = new Font("Dialog", Font.PLAIN, 36);
font[4] = new Font("Serif", Font.ITALIC, 48);
}
public void setTags(Tag[] tags) {
this.tags = tags;
}
public void updateBoard(int theta) {
this.theta = theta;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK);
g2.fillRect(0, 0, getWidth(), getHeight());
if (tags != null) {
AffineTransform at = new AffineTransform();
for (Tag tag : tags) {
g2.setFont(font[tag.getFont()]);
g2.setColor(Color.getHSBColor(tag.getColor(), 1.0F, 1.0F));
at = new AffineTransform();
at.translate(tag.getX(), tag.getY());
g2.transform(at);
at = new AffineTransform();
at.rotate(Math.toRadians(theta));
g2.transform(at);
g2.drawString(tag.getMessage(), 0, 0);
at = new AffineTransform();
at.rotate(-Math.toRadians(theta));
g2.transform(at);
at = new AffineTransform();
at.translate(-tag.getX(), -tag.getY());
g2.transform(at);
}// end for
}
}
}
public class RotateAndDraw extends JFrame implements ActionListener {
// Declare all member variables
private JFrame window;
private JButton drawButton;
private JButton rotateButton;
JTextField userInput = new JTextField("Enter text here");
private Board board = new Board(); // Drawing surface
private int rotateCount = 0;
public RotateAndDraw() {
// Declare all components
window = new JFrame("Rotate and Draw");
drawButton = new JButton("Draw");
rotateButton = new JButton("Rotate");
drawButton.addActionListener(this);
rotateButton.addActionListener(this);
JLabel userInputLabel = new JLabel("Text: ");
// Create some containers
JPanel content = new JPanel();
content.setLayout(new GridLayout(3, 1));
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(1, 2));
p1.add(drawButton);
p1.add(rotateButton);
JPanel p2 = new JPanel();
p2.setLayout(new GridLayout(1, 3));
userInputLabel.setHorizontalAlignment(SwingConstants.RIGHT);
p2.add(userInputLabel);
p2.add(userInput);
JLabel nullLabel = new JLabel("");
p2.add(nullLabel);
board.setBackground(Color.BLACK);
content.add(p1);
content.add(p2);
content.add(board);
window.add(content);
}
public void run() {
window.setLocation(100, 100);
window.setSize(400, 400);
window.setDefaultCloseOperation(EXIT_ON_CLOSE);
window.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String message = userInput.getText();
if (e.getSource() == drawButton) {
rotateCount = 0;
int width = board.getWidth();
int height = board.getHeight();
Tag[] tags = new Tag[100];
for (int i = 0; i < tags.length; i++) {
int fontNum = (int) (5 * Math.random());
float hue = (float) Math.random();
int x = (int) (Math.random() * width);
int y = (int) (Math.random() * height);
tags[i] = new Tag(message, x, y, fontNum, hue);
} // end for
board.setTags(tags);
}// end if
if (e.getSource() == rotateButton) {
rotateCount = (rotateCount + 1) % 4;
}
board.updateBoard(90 * rotateCount);
board.repaint();
}
public static void main(String[] args) {
RotateAndDraw rad = new RotateAndDraw();
rad.run();
}
}