java swing 中paint方法

lryxxh 2011-11-10 11:25:20
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.GeneralPath;
import java.util.Calendar;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;


public class ClockTest extends JFrame{

/**
*
*/
private static final long serialVersionUID = 1127815638909706067L;

public ClockTest() {

this.setSize(400,430);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
init();
this.setVisible(true);
Timer timer = new Timer(1000, new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
paintDigital((Graphics2D) getGraphics());
}
});
timer.start();
}
JLabel label ;
private void init() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(390,410));
panel.setLayout(new BorderLayout());
final int r = 170; // 表盘半径
final int sr = 20; //刻度圆形半径

final int secr = (int)(r * 0.8 );
final int minr = (int)(secr * 0.8);
final int hourr = (int)(minr * 0.8);
this.getContentPane().add(panel);

}
private int getW2() {
// TODO Auto-generated method stub
return 180;
}

private int getH2() {
// TODO Auto-generated method stub
return 170;
}

private int getCenterX2() {
// TODO Auto-generated method stub
return 20 + r;
}
int r = (int) ((getH2() < getW2() ? getH2() : getW2()) * 0.9); // 表盘半径
private int getCenterY2() {
// TODO Auto-generated method stub
return 20 + r;
}
public void paintDigital(Graphics2D g2){
// super.paint(g2);
// Color oldColor = g2.getColor();
// g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);

// paintScaleClock(g2, r, cx, cy, sr);
final int r = (int) ((getH2() < getW2() ? getH2() : getW2()) * 0.9); // 表盘半径
final int sr = (int) (r * 0.1); //刻度圆形半径
final int secr = (int)(r * 0.8 );
final int minr = (int)(secr * 0.8);
final int hourr = (int)(minr * 0.8);
int cx = (int) getCenterX2();
int cy = (int) getCenterY2();
Color oldColor = g2.getColor();

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);

/*
*画表盘刻度.
*/
for(int i = 0 ;i < 12; i++) {
int scalePx = cx + (int) Math.round(r * Math.cos(2 * Math.PI /12 * (i+1)));
int scalePy = cy + (int) Math.round(r * Math.sin(2 * Math.PI /12 * (i+1)));
g2.setColor(Color.BLUE);
g2.fillOval(scalePx - sr/2, scalePy - sr/2, sr, sr);
}

Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR);
int min = calendar.get(Calendar.MINUTE);
int sec = calendar.get(Calendar.SECOND);
/*
* 画小时指针.
*/
{
double minOfHour = min / 60 ;
double hourdu = 2 * Math.PI * hour / 12 + 2 * Math.PI /12 * min / 60;
double innerLeftHour = hourdu - Math.PI / 5;
double innerRightHour = hourdu + Math.PI / 5;
long hourX = cx;
long hourY = cy;
long hourLeftInnerX = cx;
long hourLeftInnerY = cy;
long hourRightInnerX = cx;
long hourRightInnerY = cy;
{
hourX = cx + Math.round(hourr * Math.cos(hourdu - Math.PI/2));
hourY = cy + Math.round(hourr * Math.sin(hourdu - Math.PI/2));
hourLeftInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerLeftHour - Math.PI/2));
hourLeftInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerLeftHour - Math.PI/2));
hourRightInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerRightHour - Math.PI/2));
hourRightInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerRightHour - Math.PI/2));
}
GeneralPath hourShape = new GeneralPath();
hourShape.moveTo(cx, cy);
hourShape.lineTo(hourLeftInnerX, hourLeftInnerY);
hourShape.lineTo(hourX, hourY);
hourShape.lineTo(hourRightInnerX, hourRightInnerY);
// hourShape.lineTo(cx, cy);
hourShape.closePath();


g2.setColor(Color.BLUE);
g2.fillOval((int)(cx - hourr * 0.1), (int)(cy - hourr * 0.1) , (int)(hourr * 0.2), (int)(hourr * 0.2));
g2.fill(hourShape);
g2.setColor(oldColor);
}

/*
*画分钟指针,秒指针.
*/
{
double secdu = 2 * Math.PI * sec / 60;
double mindu = 2 * Math.PI * min / 60;
double innerLeftMin = mindu - Math.PI / 10;
double innerRightMin = mindu + Math.PI / 10;
double innerLeftSec = secdu - Math.PI /15;
double innerRightSec = secdu + Math.PI / 15;
long secX = cx;
long secY = cy;
long minX = cx;
long minY = cy;
long minLeftInnerX = cx;
long minLeftInnerY = cy;
long minRightInnerX = cx;
long minRightInnerY = cy;
long secLeftInnerX = cx;
long secLeftInnerY = cy;
long secRightInnerX = cx;
long secRightInnerY = cy;
{
secX = cx + Math.round(secr * Math.cos(secdu - Math.PI/2));
secY = cy + Math.round(secr * Math.sin(secdu - Math.PI/2));
minX = cx + Math.round(minr * Math.cos(mindu - Math.PI/2));
minY = cy + Math.round(minr * Math.sin(mindu - Math.PI/2));

minLeftInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerLeftMin - Math.PI/2));
minLeftInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerLeftMin - Math.PI/2));
minRightInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerRightMin - Math.PI/2));
minRightInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerRightMin - Math.PI/2));

secLeftInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerLeftSec - Math.PI/2));
secLeftInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerLeftSec - Math.PI/2));
secRightInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerRightSec - Math.PI/2));
secRightInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerRightSec - Math.PI/2));
}
GeneralPath minShape = new GeneralPath();
minShape.moveTo(cx, cy);
minShape.lineTo(minLeftInnerX, minLeftInnerY);
minShape.lineTo(minX, minY);
minShape.lineTo(minRightInnerX, minRightInnerY);
minShape.lineTo(cx, cy);
minShape.closePath();

GeneralPath secShape = new GeneralPath();
secShape.moveTo(cx, cy);
secShape.lineTo(secLeftInnerX, secLeftInnerY);
secShape.lineTo(secX, secY);
secShape.lineTo(secRightInnerX, secRightInnerY);
secShape.lineTo(cx, cy);
secShape.closePath();

g2.setColor(Color.GREEN);
g2.fillOval((int)(cx - hourr * 0.08), (int)(cy - hourr * 0.08), (int)(hourr * 0.16), (int)(hourr * 0.16));
g2.fill(minShape);
// g2.drawLine(cx, cy, (int)minX, (int)minY);
g2.setColor(Color.RED);
g2.fillOval((int)(cx - hourr * 0.06), (int)(cy - hourr * 0.06) , (int)(hourr * 0.12), (int)(hourr * 0.12));
g2.fill(secShape);
// g2.drawLine(cx, cy, (int)secX, (int)secY);
}

}

public Shape getHourShape(int cx, int cy, int r, int innerr, int width) {
Shape shape = new GeneralPath();

return shape;
}

public static void main(String[] args) {
new ClockTest();
}

}
}
可以运行看下效果。因为其他的原因,只能修改paintDigital方法中的内容.不能调用repaint或者父类的方法.
...全文
263 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
huntor 2011-11-10
  • 打赏
  • 举报
回复
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.GeneralPath;
import java.util.Calendar;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;


public class ClockTest extends JFrame{
private static final long serialVersionUID = 1127815638909706067L;
private JLabel label;
private int r = (int) (Math.min(getH2(), getW2()) * 0.9); // 表盘半径

public ClockTest() {
super("Clock");
this.setSize(400,430);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
init();
this.setVisible(true);
Timer timer = new Timer(1000, new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
repaint();
}
});
timer.start();
}

private void init() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(390,410));
panel.setLayout(new BorderLayout());
// final int r = 170; // 表盘半径
final int sr = 20; //刻度圆形半径

final int secr = (int)(r * 0.8 );
final int minr = (int)(secr * 0.8);
final int hourr = (int)(minr * 0.8);
this.getContentPane().add(panel);

}
private int getW2() {
return 180;
}

private int getH2() {
return 170;
}

private int getCenterX2() {
return 40 + r;
}

private int getCenterY2() {
return 40 + r;
}
public void paint(Graphics g){
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
final int r = (int) (Math.min(getH2(), getW2()) * 0.9); // 表盘半径
final int sr = (int) (r * 0.1); //刻度圆形半径
final int secr = (int)(r * 0.8 );
final int minr = (int)(secr * 0.8);
final int hourr = (int)(minr * 0.8);
int cx = (int) getCenterX2();
int cy = (int) getCenterY2();
Color oldColor = g2.getColor();

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);

/*
*画表盘刻度.
*/
for(int i = 0 ;i < 12; i++) {
int scalePx = cx + (int) Math.round(r * Math.cos(2 * Math.PI /12 * (i+1)));
int scalePy = cy + (int) Math.round(r * Math.sin(2 * Math.PI /12 * (i+1)));
g2.setColor(Color.BLUE);
g2.fillOval(scalePx - sr/2, scalePy - sr/2, sr, sr);
}

Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR);
int min = calendar.get(Calendar.MINUTE);
int sec = calendar.get(Calendar.SECOND);
/*
* 画小时指针.
*/
{
double minOfHour = min / 60 ;
double hourdu = 2 * Math.PI * hour / 12 + 2 * Math.PI /12 * min / 60;
double innerLeftHour = hourdu - Math.PI / 5;
double innerRightHour = hourdu + Math.PI / 5;
long hourX = cx;
long hourY = cy;
long hourLeftInnerX = cx;
long hourLeftInnerY = cy;
long hourRightInnerX = cx;
long hourRightInnerY = cy;
{
hourX = cx + Math.round(hourr * Math.cos(hourdu - Math.PI/2));
hourY = cy + Math.round(hourr * Math.sin(hourdu - Math.PI/2));
hourLeftInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerLeftHour - Math.PI/2));
hourLeftInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerLeftHour - Math.PI/2));
hourRightInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerRightHour - Math.PI/2));
hourRightInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerRightHour - Math.PI/2));
}
GeneralPath hourShape = new GeneralPath();
hourShape.moveTo(cx, cy);
hourShape.lineTo(hourLeftInnerX, hourLeftInnerY);
hourShape.lineTo(hourX, hourY);
hourShape.lineTo(hourRightInnerX, hourRightInnerY);
// hourShape.lineTo(cx, cy);
hourShape.closePath();


g2.setColor(Color.BLUE);
g2.fillOval((int)(cx - hourr * 0.1), (int)(cy - hourr * 0.1) , (int)(hourr * 0.2), (int)(hourr * 0.2));
g2.fill(hourShape);
g2.setColor(oldColor);
}

/*
*画分钟指针,秒指针.
*/
{
double secdu = 2 * Math.PI * sec / 60;
double mindu = 2 * Math.PI * min / 60;
double innerLeftMin = mindu - Math.PI / 10;
double innerRightMin = mindu + Math.PI / 10;
double innerLeftSec = secdu - Math.PI /15;
double innerRightSec = secdu + Math.PI / 15;
long secX = cx;
long secY = cy;
long minX = cx;
long minY = cy;
long minLeftInnerX = cx;
long minLeftInnerY = cy;
long minRightInnerX = cx;
long minRightInnerY = cy;
long secLeftInnerX = cx;
long secLeftInnerY = cy;
long secRightInnerX = cx;
long secRightInnerY = cy;
{
secX = cx + Math.round(secr * Math.cos(secdu - Math.PI/2));
secY = cy + Math.round(secr * Math.sin(secdu - Math.PI/2));
minX = cx + Math.round(minr * Math.cos(mindu - Math.PI/2));
minY = cy + Math.round(minr * Math.sin(mindu - Math.PI/2));

minLeftInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerLeftMin - Math.PI/2));
minLeftInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerLeftMin - Math.PI/2));
minRightInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerRightMin - Math.PI/2));
minRightInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerRightMin - Math.PI/2));

secLeftInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerLeftSec - Math.PI/2));
secLeftInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerLeftSec - Math.PI/2));
secRightInnerX = cx + Math.round(hourr * 0.2 * Math.cos(innerRightSec - Math.PI/2));
secRightInnerY = cy + Math.round(hourr * 0.2 * Math.sin(innerRightSec - Math.PI/2));
}
GeneralPath minShape = new GeneralPath();
minShape.moveTo(cx, cy);
minShape.lineTo(minLeftInnerX, minLeftInnerY);
minShape.lineTo(minX, minY);
minShape.lineTo(minRightInnerX, minRightInnerY);
minShape.lineTo(cx, cy);
minShape.closePath();

GeneralPath secShape = new GeneralPath();
secShape.moveTo(cx, cy);
secShape.lineTo(secLeftInnerX, secLeftInnerY);
secShape.lineTo(secX, secY);
secShape.lineTo(secRightInnerX, secRightInnerY);
secShape.lineTo(cx, cy);
secShape.closePath();

g2.setColor(Color.GREEN);
g2.fillOval((int)(cx - hourr * 0.08), (int)(cy - hourr * 0.08), (int)(hourr * 0.16), (int)(hourr * 0.16));
g2.fill(minShape);
g2.setColor(Color.RED);
g2.fillOval((int)(cx - hourr * 0.06), (int)(cy - hourr * 0.06) , (int)(hourr * 0.12), (int)(hourr * 0.12));
g2.fill(secShape);
}

}

private Shape getHourShape(int cx, int cy, int r, int innerr, int width) {
Shape shape = new GeneralPath();

return shape;
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new java.lang.Runnable(){
@Override public void run(){
new ClockTest();
}
});
}
}
huntor 2011-11-10
  • 打赏
  • 举报
回复
你想让你的代码正常,在 paintDigital 方法的前面加上

g2.clearRect(0,0,400,430); 


中心重新指定一下,现在运行时12点的标志显示不全。
lryxxh 2011-11-10
  • 打赏
  • 举报
回复
很感谢,但是不能用repaint以及component的方法.我这个是模拟我的问题,主要就是我的类中没有repaint以及paint之类的方法可调,所以才出现这个问题的.
huntor 2011-11-10
  • 打赏
  • 举报
回复
你看看下面的,指针只画了个线段
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.Calendar;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.Timer;

public class ClockBoard extends JComponent {
private static final long serialVersionUID = -8822541270063945378L;
private final int BORDER_WIDTH = 5;
private final int MARKER_WIDTH = 10;
private int width = 200;
private Calendar calendar;
private Point2D center;
public ClockBoard(int width){
this.width = width;
this.calendar = Calendar.getInstance();
center = new Point2D.Double(width/2+BORDER_WIDTH,width/2+BORDER_WIDTH);
setPreferredSize(new Dimension(width+BORDER_WIDTH*2,width+BORDER_WIDTH*2));
}

public void tick(){
calendar.add(Calendar.SECOND,1);
repaint();
}

@Override public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,RenderingHints.VALUE_COLOR_RENDER_QUALITY);

paintBoard(g2d);
paintHourPointer(g2d);
paintMinutePointer(g2d);
paintSecondPointer(g2d);
}

private void paintBoard(Graphics2D g2d){
g2d.setPaint(Color.GREEN.darker().darker());
g2d.setStroke(new BasicStroke(2));
g2d.draw(new Ellipse2D.Double(5,5,width,width)); // circle
g2d.setPaint(Color.GREEN.darker().darker());
g2d.fill(new Ellipse2D.Double(width/2,5,MARKER_WIDTH,MARKER_WIDTH)); // 12
g2d.fill(new Ellipse2D.Double(5,width/2,MARKER_WIDTH,MARKER_WIDTH)); // 9
g2d.fill(new Ellipse2D.Double(width-5,width/2,MARKER_WIDTH,MARKER_WIDTH)); // 3
g2d.fill(new Ellipse2D.Double(width/2,width-5,MARKER_WIDTH,MARKER_WIDTH)); // 6
g2d.draw(new Ellipse2D.Double(width/2,width/2,MARKER_WIDTH,MARKER_WIDTH)); // center
Point2D p1 = new Point2D.Double(width/2+BORDER_WIDTH,BORDER_WIDTH);
Point2D p2 = new Point2D.Double(width/2+BORDER_WIDTH,BORDER_WIDTH + MARKER_WIDTH/2);
AffineTransform t1 = AffineTransform.getRotateInstance(Math.PI/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t1.transform(p1,null),t1.transform(p2,null))); // 1
AffineTransform t2 = AffineTransform.getRotateInstance(Math.PI/3,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t2.transform(p1,null),t2.transform(p2,null))); // 2
AffineTransform t3 = AffineTransform.getRotateInstance(Math.PI*2/3,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t3.transform(p1,null),t3.transform(p2,null))); // 4
AffineTransform t4 = AffineTransform.getRotateInstance(Math.PI*5/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t4.transform(p1,null),t4.transform(p2,null))); // 5
AffineTransform t5 = AffineTransform.getRotateInstance(Math.PI*7/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t5.transform(p1,null),t5.transform(p2,null))); // 7
AffineTransform t6 = AffineTransform.getRotateInstance(Math.PI*8/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t6.transform(p1,null),t6.transform(p2,null))); // 8
AffineTransform t7 = AffineTransform.getRotateInstance(Math.PI*10/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t7.transform(p1,null),t7.transform(p2,null))); // 10
AffineTransform t8 = AffineTransform.getRotateInstance(Math.PI*11/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t8.transform(p1,null),t8.transform(p2,null))); // 11
}

private void paintHourPointer(Graphics2D g2d){
final int H_LENGTH = 50;
Point2D hourPoint = new Point2D.Double(width/2+BORDER_WIDTH,width/2- H_LENGTH);
double theta = Math.PI*2 * (calendar.get(Calendar.HOUR)*3600 + calendar.get(Calendar.MINUTE)*60 + calendar.get(Calendar.SECOND))/(12*3600);
AffineTransform transform = AffineTransform.getRotateInstance(theta,center.getX(),center.getY());
Line2D hourLine = new Line2D.Double(center,transform.transform(hourPoint,null));
g2d.setStroke(new BasicStroke(4));
g2d.setPaint(Color.BLUE);
g2d.draw(hourLine);
}

private void paintMinutePointer(Graphics2D g2d){
final int M_LENGTH = 70;
Point2D minutePoint = new Point2D.Double(width/2+BORDER_WIDTH, width/2-M_LENGTH);
double theta = Math.PI * 2 * (calendar.get(Calendar.MINUTE)*60 + calendar.get(Calendar.SECOND))/3600 ;
AffineTransform transform = AffineTransform.getRotateInstance(theta,center.getX(),center.getY());
Line2D minuteLine = new Line2D.Double(center,transform.transform(minutePoint,null));
g2d.setStroke(new BasicStroke(3));
g2d.setPaint(Color.BLACK);
g2d.draw(minuteLine);
}

private void paintSecondPointer(Graphics2D g2d){
final int S_LENGTH = 80;
Point2D secondPoint = new Point2D.Double(width/2+BORDER_WIDTH,width/2-S_LENGTH);
double theta = Math.PI * 2 * calendar.get(Calendar.SECOND)/60;
AffineTransform transform = AffineTransform.getRotateInstance(theta,center.getX(),center.getY());
Line2D secondLine = new Line2D.Double(center,transform.transform(secondPoint,null));
g2d.setStroke(new BasicStroke(2));
g2d.setPaint(Color.RED);
g2d.draw(secondLine);
}

public static void main(final String[] args) {
java.awt.EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frame = new JFrame("Clock");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
final ClockBoard board = new ClockBoard(200);
board.setBorder(BorderFactory.createEmptyBorder(15,15,15,15));
frame.getContentPane().add(board);
Timer timer = new Timer(1000,new ActionListener(){
public void actionPerformed(ActionEvent e){
board.tick();
}
});

frame.pack();
frame.setVisible(true);
timer.start();
}
});
}
}

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧