Java Swing : 图形组件只出现在左上角区域
Java Swing : Graphic component only appears in top-left corner zone
我目前正在尝试在 Java 中实现一个简单的动画。
我有一个面板,我想在其中打印一个 BufferedImage。我将图像位置设置在一点并设置其尺寸。
然而,就好像我将图像的 "print zone" 及其尺寸放在左上角,并且只有属于该打印区域的图像部分被绘制,如您所见在下图中:
我想这可能是我缺少的一项基本内容,但是我找不到与我的问题相对应的任何答案,而且我是 java 的初学者,所以..
这是我的代码中与此问题相关的部分:
public abstract class ObjetAnime extends JPanel{
protected Point location;
protected Dimension dim;
protected BufferedImage picture;
ObjetAnime(ObjetsPropriete objetProp)
{
location = new Point(10,10);
dim = objetProp.getDimension();
try {
picture = ImageIO.read(new File(objetProp.getPath()));
} catch (IOException e1) {
e1.printStackTrace();
}
this.setSize(dim);
this.setLocation(location);
this.setLayout(null);
this.setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
if (picture != null) {
g.drawImage(picture, location.x, location.y, this);
}
}
在超级class中我有:
public ListeObjets(GConfig gconfig, GPanel jeuPanel)
{
setListeObjets(new ArrayList<ObjetAnime>());
panel = jeuPanel;
for( int i = 0; i < gconfig.getObjetsTab().length; ++i)
{
switch(gconfig.getObjetsTab()[i].getType())
{
case ROND:
getListeObjets().add(new Rond(gconfig.getObjetsTab()[i]));
break;
}
}
addToPanel(panel);
}
public void addToPanel(GPanel jeuPanel) {
jeuPanel.setLayout(null);
Iterator iterator = getListeObjets().iterator();
ObjetAnime obj = (ObjetAnime) iterator.next();
jeuPanel.add(obj, obj.location);
while(iterator.hasNext())
{
obj = (ObjetAnime) iterator.next();
jeuPanel.add(obj, obj.location);
}
System.out.println(obj);
}
对象属性为:
public ObjetsPropriete()
{
path = new String("./Images/Boule.png");
dim = new Dimension(32,32);
type = Objet.ROND;
}
非常感谢,祝您有愉快的一天!
location = new Point(10,10);
您所有的对象都位于 (10, 10) 位置,所以我猜它们相互重叠。所以摆脱那个声明。
jeuPanel.add(obj, obj.location);
第二个参数对 add(...) 方法没有任何意义。它不指定组件的位置。去掉第二个参数。
(如果我理解您的代码)并且您想指定位置,那么您需要执行以下操作:
//getListeObjets().add(new Rond(gconfig.getObjetsTab()[i]));
Rond rond = new Rond(gconfig.getObjetsTab()[i]);
rond.setLocation(32*i, 32*i);
getListeObjets().add(rond);
以上代码会将每个对象沿对角线放置在面板中。
关键是您需要将每个组件设置到唯一的位置。
谢谢你的回答,多亏了这个我找到了解决问题的方法。
问题的原因是在 objectLocation 使用 drawImage,而 drawImage 在指定位置的对象本身上打印。
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
if (picture != null) {
g.drawImage(picture, 0, 0, this);
}
}
我目前正在尝试在 Java 中实现一个简单的动画。 我有一个面板,我想在其中打印一个 BufferedImage。我将图像位置设置在一点并设置其尺寸。
然而,就好像我将图像的 "print zone" 及其尺寸放在左上角,并且只有属于该打印区域的图像部分被绘制,如您所见在下图中:
我想这可能是我缺少的一项基本内容,但是我找不到与我的问题相对应的任何答案,而且我是 java 的初学者,所以..
这是我的代码中与此问题相关的部分:
public abstract class ObjetAnime extends JPanel{
protected Point location;
protected Dimension dim;
protected BufferedImage picture;
ObjetAnime(ObjetsPropriete objetProp)
{
location = new Point(10,10);
dim = objetProp.getDimension();
try {
picture = ImageIO.read(new File(objetProp.getPath()));
} catch (IOException e1) {
e1.printStackTrace();
}
this.setSize(dim);
this.setLocation(location);
this.setLayout(null);
this.setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
if (picture != null) {
g.drawImage(picture, location.x, location.y, this);
}
}
在超级class中我有:
public ListeObjets(GConfig gconfig, GPanel jeuPanel)
{
setListeObjets(new ArrayList<ObjetAnime>());
panel = jeuPanel;
for( int i = 0; i < gconfig.getObjetsTab().length; ++i)
{
switch(gconfig.getObjetsTab()[i].getType())
{
case ROND:
getListeObjets().add(new Rond(gconfig.getObjetsTab()[i]));
break;
}
}
addToPanel(panel);
}
public void addToPanel(GPanel jeuPanel) {
jeuPanel.setLayout(null);
Iterator iterator = getListeObjets().iterator();
ObjetAnime obj = (ObjetAnime) iterator.next();
jeuPanel.add(obj, obj.location);
while(iterator.hasNext())
{
obj = (ObjetAnime) iterator.next();
jeuPanel.add(obj, obj.location);
}
System.out.println(obj);
}
对象属性为:
public ObjetsPropriete()
{
path = new String("./Images/Boule.png");
dim = new Dimension(32,32);
type = Objet.ROND;
}
非常感谢,祝您有愉快的一天!
location = new Point(10,10);
您所有的对象都位于 (10, 10) 位置,所以我猜它们相互重叠。所以摆脱那个声明。
jeuPanel.add(obj, obj.location);
第二个参数对 add(...) 方法没有任何意义。它不指定组件的位置。去掉第二个参数。
(如果我理解您的代码)并且您想指定位置,那么您需要执行以下操作:
//getListeObjets().add(new Rond(gconfig.getObjetsTab()[i]));
Rond rond = new Rond(gconfig.getObjetsTab()[i]);
rond.setLocation(32*i, 32*i);
getListeObjets().add(rond);
以上代码会将每个对象沿对角线放置在面板中。
关键是您需要将每个组件设置到唯一的位置。
谢谢你的回答,多亏了这个我找到了解决问题的方法。
问题的原因是在 objectLocation 使用 drawImage,而 drawImage 在指定位置的对象本身上打印。
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
if (picture != null) {
g.drawImage(picture, 0, 0, this);
}
}