我想在一个JPanel中绘制一些不同的JComponents。我用不同的绘制方法创建了一些JComponents。然后在main中创建对象并将它们放到JFrame中。 我的问题是,只有最后一个对象在窗口中绘制。
如何在窗口中放置不同的JComponent,而不删除或重新绘制旧的JComponents?
(Model2与Model1类似,但paintComponent有点不同)
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GuiModel{
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setSize(600, 600);
frame.setLocation(150, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.getContentPane().add(new Model1(0,0));
frame.getContentPane().add(new Model2(25,37,true));
}
}
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
public class Model1 extends JComponent {
private int xPos, yPos;
Model1 (int x, int y){
this.xPos = x;
this.yPos = y;
}
@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.BLACK);
g.drawOval(xPos, yPos, 5, 5);
}
}
答案 0 :(得分:3)
进行自定义绘画时:
您需要覆盖组件的getPreferredSize()
方法以返回组件的大小,以便布局管理器可以显示组件。现在你的组件的大小是(0,0)所以没有什么可画的。
组件的绘制是从(0,0)完成的,而不是(x,y)。然后,如果将组件放置在面板上的特定点,则使用setLocation(x,y)告诉Swing绘制组件的位置。
如果要在随机位置绘制组件,则还需要在面板上使用空布局,并且还必须设置组件的大小。要设置组件的大小,可以在构造函数中使用setSize(getPreferredSize())。
所以你的Model1类看起来像:
public class Model1 extends JComponent {
//private int xPos, yPos;
Model1 (int x, int y){
//this.xPos = x;
//this.yPos = y;
setLocation(x, y);
setSize( getPreferredSize() );
}
@Override
public Dimension getPreferredSize()
{
return new Dimension(5, 5);
}
@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.BLACK);
//g.drawOval(xPos, yPos, 5, 5);
g.drawOval(0, 0, 5, 5);
}
}
答案 1 :(得分:2)
JFrame
默认使用BorderLayout
。在未指定约束的情况下添加组件时,每个组件都将放置在CENTER
。
指定约束,或者如果BorderLayout
不适合你,请切换到另一个布局。
添加约束:
frame.add(new Model1(0,0), BorderLayout.NORTH);
我建议您阅读How to use BorderLayout以及guides on the other predefined layouts。此外,如果JDK提供的任何布局都不符合您的需求,请随时在线查看第三方布局。或者,如果没有符合您需求的布局,您可以创建自己的LayoutManager
我还建议您使用pack()
根据中的组件调整框架大小,而不是使用frame.setSize
设置其大小。这可以确保您的框架紧紧包裹在其中的任何内部,不留空的空间。如果您想要空格,则应由布局管理器处理
答案 2 :(得分:-1)
您可以指定组件的大小,也可以使用“布局”将对象放在一个位置。或者您可以创建Graphics的副本并在其中写入:
protected void paintComponent(Graphics g) {
g = g.create();
g.setColor(Color.BLACK);
g.drawOval(xPos, yPos, 5, 5);
g.dispose();
}
但是最后一个变种效率不高:它会在每次重绘时复制图形。