gpt4 book ai didi

Java 绘制奇怪的视觉工件/错误

转载 作者:搜寻专家 更新时间:2023-11-01 03:04:25 24 4
gpt4 key购买 nike

我是 Java 编程的初学者。我们被赋予了一项任务,要做一些算法。我得到了谢尔宾斯基三角。我想创建一个二维数组并存储值,0 = 白色矩形,1 = 蓝色矩形。我在画它时遇到了很大的麻烦(从来没有任何 swing/awt 的经验)。我终于做到了,但是在绘图的末尾有一个奇怪的视觉错误。它没有结束,但线条仍在继续。

我不知道为什么会这样。

这是我的代码:

扩展 JPanel

Okno 类:

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package newpackage;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Arrays;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
*
* @author Juraj
*/
class Okno extends JPanel {

// value = 1 is blue rectangle, value 0 = white rectangle
public static int n = 500;
public static int[][] tabulka = new int[n][n]; //creating 2D array

public static void inicializaciaTabulky(){
for (int i = 0; i < n; i++) { // initialization of 2D array (first column and first row = 1)
tabulka[0][i] = 1;
tabulka[i][0] = 1;
}
}

// filling the rest of the array; if the cell above and cell to the left are the same value, e.g.
// value of 1 or 0, then it is 0, everything else is 1
public static void doplnenieTabulky() {
for (int i = 1; i < n; i++) {
for (int j = 1; j < n; j++) {
if (tabulka[i-1][j] == 1 && tabulka[i][j-1] == 1 ||
tabulka[i-1][j] == 0 && tabulka[i][j-1] == 0) {
tabulka[i][j] = 0;
} else {
tabulka[i][j] = 1;
}
}
}
}

// drawing rectangles; if the value is 1 = blue rectangle, value 0 = white rectangle
private void vykreslenie(Graphics g){
Graphics2D g2d = (Graphics2D) g;

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
switch(tabulka[i][j]) {
case 0:
g.setColor(Color.white);
g.drawRect(i, j, 50, 50);
break;
case 1:
g.setColor(Color.blue);
g.drawRect(i, j, 50, 50);
break;
}
}
}
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
vykreslenie(g);
}
}
扩展 JFrame

Trojuholnik 类:

public class Trojuholnik extends JFrame {  
public Trojuholnik() {
initUI();
}

private void initUI() {
setSize(800, 600);
setTitle("Sierpinski Triangle");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(new Okno());
setLocationRelativeTo(rootPane);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Trojuholnik trojuholnik = new Trojuholnik();
trojuholnik.setVisible(true);
Okno.inicializaciaTabulky();
Okno.doplnenieTabulky();
System.out.println(Arrays.deepToString(Okno.tabulka));
}
});
}
}

当前结果如下所示:

result of code

最佳答案

首先是一些基本的建议:

不要创建扩展 JFrame 的类。您没有向框架添加新功能,因此您应该只是将面板添加到框架。所以你的 run() 方法中的基本代码应该是这样的:

JFrame frame = new JFrame();
frame.setTitle("Sierpinski Triangle");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new Okno());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

不要在您的 Okno 类中使用静态变量和方法。只需为您的类创建构造函数并在构造函数中初始化数组。

在进行自定义绘画时,您应该覆盖类的 getPreferredSize() 方法以返回组件的大小,因为每个组件都应该知道自己的大小。请注意我是如何更改上面的代码以使用 pack() 方法的。现在框架将正确调整大小。因此,您可以在 Okno 类中添加如下内容:

@Override
public Dimension getPreferredSize()
{
return new Dimension(500, 500);
}

关于绘画问题。我真的不知道算法在做什么,但我怀疑问题是你的数组有 500 个值,但是矩形的绘画使用的是 50 的大小,所以实际上你的面板大小是 550x550 而不是 500x500这会导致伪影。

我认为解决方案是简单地绘制一个大小为 (1, 1) 的矩形。至少这幅画对我来说看起来是一样的。

关于Java 绘制奇怪的视觉工件/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27659077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com