使用 pack() 将 JFrame 缩放到适当大小的问题
Problems scaling JFrame to proper size using pack()
第一学期CS学生。我正在从事一个受之前任务启发的自我激励项目。
使用 swing 和 awt,我试图创建一个 JFrame 并在其中绘画,但我无法使 window 正确缩放以适应我使用 pack() 添加的组件.
我已经注释掉了 setPreferredSize() 行,因为它什么都不做,这正是我感到困惑的地方。 class MyCanvas 是组件吧?在该组件内部,我正在绘制形状和线条。据我所知,setPreferredSize() 应该在组件中调用,而不是组件内部的方法。我已经在 NewGrid()、组件和 paint() 方法中尝试了 setPreferredSize(),但无论如何,window 以两种方式之一出现:
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);
}
}
}
}
简答
//setPreferredSize(new Dimension(600, 600));
// this line does nothing and I can't figure out why
一方面,代码无法编译。
该语句需要成为 class 的构造函数的一部分。 Sp你需要用上面的语句添加构造函数。
此外,pack()
和 setVisible(...)
语句应该是最后执行的语句,在将所有组件添加到框架并设置框架的属性之后。
注意 setResizable(...) 方法在放置 before/after pack() 时如何影响框架。
更好的答案
Using swing and awt,
不要混用 Swing 和 AWT 组件。
不要扩展 Canvas。而是使用 JPanel
.
I can't get the window to scale properly to fit the components
Swing 中的自定义绘制是通过扩展 JPanel
完成的,然后您覆盖自定义绘制的 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 教程中的部分,了解更多信息和帮助您入门的工作示例。
第一学期CS学生。我正在从事一个受之前任务启发的自我激励项目。
使用 swing 和 awt,我试图创建一个 JFrame 并在其中绘画,但我无法使 window 正确缩放以适应我使用 pack() 添加的组件.
我已经注释掉了 setPreferredSize() 行,因为它什么都不做,这正是我感到困惑的地方。 class MyCanvas 是组件吧?在该组件内部,我正在绘制形状和线条。据我所知,setPreferredSize() 应该在组件中调用,而不是组件内部的方法。我已经在 NewGrid()、组件和 paint() 方法中尝试了 setPreferredSize(),但无论如何,window 以两种方式之一出现:
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);
}
}
}
}
简答
//setPreferredSize(new Dimension(600, 600));
// this line does nothing and I can't figure out why
一方面,代码无法编译。
该语句需要成为 class 的构造函数的一部分。 Sp你需要用上面的语句添加构造函数。
此外,pack()
和 setVisible(...)
语句应该是最后执行的语句,在将所有组件添加到框架并设置框架的属性之后。
注意 setResizable(...) 方法在放置 before/after pack() 时如何影响框架。
更好的答案
Using swing and awt,
不要混用 Swing 和 AWT 组件。
不要扩展 Canvas。而是使用 JPanel
.
I can't get the window to scale properly to fit the components
Swing 中的自定义绘制是通过扩展 JPanel
完成的,然后您覆盖自定义绘制的 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 教程中的部分,了解更多信息和帮助您入门的工作示例。