第一学期CS学生。我正致力于一个自我激励的项目,该项目受到之前任务的启发。
使用swing和awt,我正在尝试创建一个JFrame并在其中绘画,但我无法使窗口正确缩放以适合我使用pack()添加的组件。
我已经注释掉了setPreferredSize()行,因为它什么也没做,这让我感到困惑。 MyCanvas类是组件,对吧?在那个组件里面我画的是形状和线条。从我所看到的,setPreferredSize()应该在组件中调用,而不是组件内部的方法。我在NewGrid(),组件和paint()方法中尝试了setPreferredSize(),但无论如何,窗口都会出现以下两种方式之一:
586 x 593在NewGrid()中使用setPreferredSize():
使用setPreferredSize()代码中的任何其他位置:
import java.awt.*;
import javax.swing.*;
public class NewGrid extends JFrame {
private MyCanvas canvas = new MyCanvas();
private int size = 600;
public static void main(String[] args) {
NewGrid newGrid = new NewGrid();
}
public NewGrid() {
add(canvas);
pack();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(false);
}
private class MyCanvas extends Canvas {
//setPreferredSize(new Dimension(600, 600)); // this line does nothing and I can't figure out why
@Override
public void paint(Graphics g) {
int number = 10;
int spacing = size / number;
g.setColor(Color.darkGray);
g.fillRect(0, 0, size, size); // creates a background square on which I can draw some grid lines
// grid line loop
for (int i = 0; i < number + 1; i++) {
int lineStart = i * spacing;
g.setColor(Color.green);
// Vertical lines
g.drawLine(lineStart, 0, lineStart, size);
// Horizontal lines
g.drawLine(0, lineStart, size, lineStart);
}
}
}
}
答案 0 :(得分:2)
//setPreferredSize(new Dimension(600, 600));
// this line does nothing and I can't figure out why
一方面,代码无法编译。
该语句需要成为该类构造函数的一部分。 Sp你需要用上面的语句添加构造函数。
此外,pack()
和setVisible(...)
语句应该是最后执行的语句,在将所有组件添加到框架并且已设置框架的属性之后。
注意setResizable(...)方法在pack()之前/之后放置时如何影响帧。
使用swing和awt,
不要混合使用Swing和AWT组件。
不要扩展Canvas。而是使用JPanel
。
我无法正确缩放窗口以适应组件
通过扩展JPanel
来完成Swing中的自定义绘制,然后覆盖自定义绘制的paintComponent(...)
。
最后在面板上实现getPreferredSize()
,以便布局管理器和pack()方法可以完成它们的工作。
public class MyPanel extend JPanel
{
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent( g );
// add custom painting code
}
@Override
public Dimension getPreferredSize()
{
return new Dimension(...);
}
}
阅读Custom Painting上Swing教程中的部分,了解更多信息和一个工作示例,以帮助您入门。