我还是比较新的Java。此外,这是一个学校项目。
目标:运行时,程序是支持创建并显示3 ea。 25x25张图片。然后,每当按下按钮时,将对每个图像应用各种变换。我的问题是没有应用任何变换。
我有3个类:绘图区域,GUI构建器和主运行类。 到目前为止,GUI即将出现,初始图像显示,按钮的听众很好。按下按钮时,会显示相应的消息,但我的图像没有任何变化。
这是GUI构建器:
public class DrawArea extends JPanel{
BufferedImage boxImage;
AffineTransform at = new AffineTransform();
public Graphics2D g2;
public DrawArea(){
setBackground(Color.white);
setSize(800,600);
}
public void doTransform(int count){
switch(count){
case 0:
at.translate(-5, 0);
System.out.println("Translate images -5 in X direction.");
break;
case 1:
at.translate(0,7);
System.out.println("Translate images 7 in Y direction.");
break;
case 2:
System.out.println("Rotates images 45 degrees counter clockwise.");
at.rotate(Math.toRadians(45));
break;
case 3:
at.rotate(Math.toRadians(-90));
System.out.println("Rotates images 90 degrees clockwise.");
break;
case 4:
at.scale(2, 0);
System.out.println("Scales images 2 times for X component.");
break;
case 5:
at.scale(0, 0.5);
System.out.println("Scales images 0.5 times for Y component.");
break;
}
g2.setTransform(at);
}
public void redrawComponent(){
repaint();
}
@Override
public void paintComponent(Graphics g) {
g2 = (Graphics2D)g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Color.WHITE);
g2.fillRect(0,0,getWidth(),getHeight()); // From the old graphics API!
setPixelSize(g2, -100, 100, -100, 100, true);
/*
* Create images and store in 2d array
*/
int blk = Color.BLACK.getRGB();
int boxData[][]= newint[25][25];
for(int x = 0 ; x<25 ; x++){
for(int y = 0 ; y<25 ; y++){
if( x==0 || y==0 || x == 24 || y == 24){
boxData[x][y] = Color.BLACK.getRGB();
} else if (x>y){
boxData[x][y] = Color.red.getRGB();
} else if (x<y){
boxData[x][y] = Color.blue.getRGB();
}
}
}
boxImage = new BufferedImage(25, 25 ,BufferedImage.TYPE_INT_RGB);
//box
for (int x = 0 ; x<25 ; x++){
for(int y = 0 ; y<25 ; y++){
boxImage.setRGB(x,y,boxData[x][y]);
}
}
g2.drawImage(boxImage, -13, -40, this);
AffineTransform saveXform = g2.getTransform();
AffineTransform toCenterAt = new AffineTransform();
toCenterAt.concatenate(at);
g2.transform(toCenterAt);
g2.setTransform(saveXform);
}
private void setPixelSize(Graphics2D g2,
double left, double right, double bottom, double top,
boolean preserveAspect) {
int width = getWidth(); // The width of this drawing area, in pixels.
int height = getHeight(); // The height of this drawing area, in pixels.
if (preserveAspect) {
// Adjust the limits to match the aspect ratio of the drawing area.
double displayAspect = Math.abs((double)height / width);
double requestedAspect = Math.abs(( bottom-top ) / ( right-left ));
if (displayAspect > requestedAspect) {
// Expand the viewport vertically.
double excess = (bottom-top) * (displayAspect/requestedAspect - 1);
bottom += excess/2;
top -= excess/2;
}
else if (displayAspect < requestedAspect) {
// Expand the viewport vertically.
double excess = (right-left) * (requestedAspect/displayAspect - 1);
right += excess/2;
left -= excess/2;
}
}
g2.scale( width / (right-left), height / (bottom-top) );
g2.translate( -left, -top );
double pixelWidth = Math.abs(( right - left ) / width);
double pixelHeight = Math.abs(( bottom - top ) / height);
pixelSize = (float)Math.max(pixelWidth,pixelHeight);
}// end setPixelSize method
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
这是绘图区:
import java.text.ParseException;
public class runProject1 {
public static void main(String[] args) throws ParseException{
final Project1 panel = new Project1();
panel.setVisible(true);
}
现在我的主要班级......
<li class="">
<a href="#section-shape-3">
<svg viewBox="0 0 80 60" preserveAspectRatio="none"><use xlink:href="#tabshape"></use></svg>
<svg viewBox="0 0 80 60" preserveAspectRatio="none"><use xlink:href="#tabshape"></use></svg>
<span><a href="login.html">Login</a></span>
</a>
</li>
}
答案 0 :(得分:1)
你的问题从这里开始:
public Graphics2D g2;
没有理由保持对系统Graphics
上下文的引用,更不用说使其public
。 Graphics
由绘图系统控制,当系统需要您更新组件时,您将获得一个绘制实例。
相反,请根据需要更新转换,并在组件上调用repaint
,将转换应用于传递给Graphics
方法的paintComponent
上下文
public class DrawArea extends JPanel {
BufferedImage boxImage;
AffineTransform at = new AffineTransform();
public DrawArea() {
setBackground(Color.white);
setSize(800, 600);
}
public void doTransform(int count) {
at = new AffineTransform();
switch (count) {
case 0:
at.translate(-5, 0);
System.out.println("Translate images -5 in X direction.");
break;
case 1:
at.translate(0, 7);
System.out.println("Translate images 7 in Y direction.");
break;
case 2:
System.out.println("Rotates images 45 degrees counter clockwise.");
at.rotate(Math.toRadians(45));
break;
case 3:
at.rotate(Math.toRadians(-90));
System.out.println("Rotates images 90 degrees clockwise.");
break;
case 4:
at.scale(2, 0);
System.out.println("Scales images 2 times for X component.");
break;
case 5:
at.scale(0, 0.5);
System.out.println("Scales images 0.5 times for Y component.");
break;
}
repaint();
}
public void redrawComponent() {
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
@Override
protected void paintComponent(Graphics g) {
// Let the API fill the background
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
AffineTransform toCenterAt = new AffineTransform();
// This centers the transform in the available space
toCenterAt.translate(getWidth() / 2, getHeight() / 2);
toCenterAt.concatenate(at);
g2.transform(toCenterAt);
/*
Create images and store in 2d array
*/
int blk = Color.BLACK.getRGB();
int boxData[][] = new int[25][25];
for (int x = 0; x < 25; x++) {
for (int y = 0; y < 25; y++) {
if (x == 0 || y == 0 || x == 24 || y == 24) {
boxData[x][y] = Color.BLACK.getRGB();
} else if (x > y) {
boxData[x][y] = Color.red.getRGB();
} else if (x < y) {
boxData[x][y] = Color.blue.getRGB();
}
}
}
boxImage = new BufferedImage(25, 25, BufferedImage.TYPE_INT_RGB);
//box
for (int x = 0; x < 25; x++) {
for (int y = 0; y < 25; y++) {
boxImage.setRGB(x, y, boxData[x][y]);
}
}
g2.drawImage(boxImage, -13, -40, this);
g2.dispose();
}
}
此代码每次都会重置转换,请记住转换是累积的
您可能还想查看this example以获取更多想法
我也可能会指出过度使用static
是非常危险的,如果你不小心,可能会导致问题没有结束。 static
不是跨对象通信的手段,你应该谨慎使用它
答案 1 :(得分:0)
在这里尝试一下。它现在正在改变。我改变了一些东西,所以回过头来看看我改变了什么,看看首先出现了什么问题。还将重绘移动到doTransform方法。
public class DrawArea extends JPanel{
float pixelSize;
BufferedImage boxImage;
AffineTransform at = new AffineTransform();
public DrawArea(){
setBackground(Color.white);
setSize(800,600);
}
public void doTransform(int count){
switch(count){
case 0:
at.translate(-5, 0);
System.out.println("Translate images -5 in X direction.");
break;
case 1:
at.translate(0,7);
System.out.println("Translate images 7 in Y direction.");
break;
case 2:
System.out.println("Rotates images 45 degrees counter clockwise.");
at.rotate(Math.toRadians(45));
break;
case 3:
at.rotate(Math.toRadians(-90));
System.out.println("Rotates images 90 degrees clockwise.");
break;
case 4:
at.scale(2, 0);
System.out.println("Scales images 2 times for X component.");
break;
case 5:
at.scale(0, 0.5);
System.out.println("Scales images 0.5 times for Y component.");
break;
}
repaint();
}
public void redrawComponent(){
repaint();
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Color.WHITE);
g2.fillRect(0,0,getWidth(),getHeight()); // From the old graphics API!
setPixelSize(g2, -100, 100, -100, 100, true);
/*
* Create images and store in 2d array
*/
int blk = Color.BLACK.getRGB();
int boxData[][]= new int[25][25];
for(int x = 0 ; x<25 ; x++){
for(int y = 0 ; y<25 ; y++){
if( x==0 || y==0 || x == 24 || y == 24){
boxData[x][y] = Color.BLACK.getRGB();
} else if (x>y){
boxData[x][y] = Color.red.getRGB();
} else if (x<y){
boxData[x][y] = Color.blue.getRGB();
}
}
}
boxImage = new BufferedImage(25, 25 ,BufferedImage.TYPE_INT_RGB);
//box
for (int x = 0 ; x<25 ; x++){
for(int y = 0 ; y<25 ; y++){
boxImage.setRGB(x,y,boxData[x][y]);
}
}
AffineTransform saveXform = g2.getTransform();
AffineTransform toCenterAt = new AffineTransform();
toCenterAt.concatenate(at);
g2.transform(toCenterAt);
g2.setTransform(saveXform);
g2.setTransform(at);
g2.drawImage(boxImage, 100, 100, this);
}
private void setPixelSize(Graphics2D g2,
double left, double right, double bottom, double top,
boolean preserveAspect) {
int width = getWidth(); // The width of this drawing area, in pixels.
int height = getHeight(); // The height of this drawing area, in pixels.
if (preserveAspect) {
// Adjust the limits to match the aspect ratio of the drawing area.
double displayAspect = Math.abs((double)height / width);
double requestedAspect = Math.abs(( bottom-top ) / ( right-left ));
if (displayAspect > requestedAspect) {
// Expand the viewport vertically.
double excess = (bottom-top) * (displayAspect/requestedAspect - 1);
bottom += excess/2;
top -= excess/2;
}
else if (displayAspect < requestedAspect) {
// Expand the viewport vertically.
double excess = (right-left) * (requestedAspect/displayAspect - 1);
right += excess/2;
left -= excess/2;
}
}
g2.scale( width / (right-left), height / (bottom-top) );
g2.translate( -left, -top );
double pixelWidth = Math.abs(( right - left ) / width);
double pixelHeight = Math.abs(( bottom - top ) / height);
pixelSize = (float)Math.max(pixelWidth,pixelHeight);
}// end setPixelSize method
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}