我可以更改我在代码中放置在Jlabel上的Imageicon的位置吗?



我尝试使用," label.setbounds(100,100,250,250("one_answers" label.setlocation(100,100(",但图像不会从jlabel的顶部和中心移动。

import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Machine extends JPanel
{
    public Machine()
    {
         ImageIcon imageIcon = new ImageIcon("res/robot.png");
         JLabel label = new JLabel(imageIcon);
         add(label);
    }
     public static void main(String[] args)
     {
         JFrame frame = new JFrame();
         frame.add(new Machine());
         frame.setVisible(true);
         frame.setSize(new Dimension(1080, 720));
     }
}

您想做什么?

JPanel的默认布局是带中心对齐的FlowLayout,标签以其首选大小显示。因此标签显示在中心。

您有几个选择:

  1. 更改flowlayout的对齐方式为左右

  2. 不要将标签添加到面板中。只需将其直接添加到使用BorderLayout的框架。

然后您可以做类似:

的事情
 label.setHorizontalAlignment(JLabel.LEFT);
 label.setVerticalAlignment(JLabel.CENTER);

编辑:

只是试图使图像位于帧的中间

当您提出问题时,请发布您的实际要求。我们不知道"我可以更改位置"对您意味着什么。

因此,您要么使用BorderLayout并调整已经证明的水平/垂直对齐。

或者,您可以将框架的布局管理器设置为GridBagLayout,然后将标签直接添加到框架并使用:

frame.add(label, new GridBagConstraints());

现在,随着帧的大小,标签将动态移动。

如果要在某个位置放置图像,也许最好是使用Graphics drawImage(...)方法之一,将其直接绘制在paintComponent方法中,以允许放置一个方法图像。

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
@SuppressWarnings("serial")
public class Machine extends JPanel {
    private static final String IMG_PATH = "https://upload.wikimedia.org/wikipedia/commons/"
            + "thumb/f/f2/Abraham_Lincoln_O-55%2C_1861-crop.jpg/"
            + "250px-Abraham_Lincoln_O-55%2C_1861-crop.jpg";
    private BufferedImage img;
    private int x;
    private int y;
    public Machine() {
        setPreferredSize(new Dimension(1080, 720));
        x = 100; // or wherever you want to draw the image
        y = 100; 
        try {
            URL imgUrl = new URL(IMG_PATH);
            img = ImageIO.read(imgUrl);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (img != null) {
            g.drawImage(img, x, y, this);
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new Machine());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

版本2:Mouselistener/MouseMotionListener,以便可以移动图像

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
@SuppressWarnings("serial")
public class Machine extends JPanel {
    private static final String IMG_PATH = "https://upload.wikimedia.org/"
            + "wikipedia/commons/thumb/f/f2/"
            + "Abraham_Lincoln_O-55%2C_1861-crop.jpg/" 
            + "250px-Abraham_Lincoln_O-55%2C_1861-crop.jpg";
    private BufferedImage img;
    private int x;
    private int y;
    public Machine() {
        setPreferredSize(new Dimension(1080, 720));
        x = 100; // or wherever you want to draw the image
        y = 100;
        MyMouse mouse = new MyMouse();
        addMouseListener(mouse);
        addMouseMotionListener(mouse);
        try {
            URL imgUrl = new URL(IMG_PATH);
            img = ImageIO.read(imgUrl);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (img != null) {
            g.drawImage(img, x, y, this);
        }
    }
    private class MyMouse extends MouseAdapter {
        private Point offset;
        @Override
        public void mousePressed(MouseEvent e) {
            // check if left mouse button pushed
            if (e.getButton() != MouseEvent.BUTTON1) {
                return;
            }
            // get bounds of the image and see if mouse press within bounds
            Rectangle r = new Rectangle(x, y, img.getWidth(), img.getHeight());
            if (r.contains(e.getPoint())) {
                // set the offset of the mouse from the left upper 
                // edge of the image
                offset = new Point(e.getX() - x, e.getY() - y);
            }
        }
        @Override
        public void mouseDragged(MouseEvent e) {
            if (offset != null) {
                moveImg(e);
            }
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            if (offset != null) {
                moveImg(e);
            }
            offset = null;
        }
        private void moveImg(MouseEvent e) {
            x = e.getX() - offset.x;
            y = e.getY() - offset.y;
            repaint();
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new Machine());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

最新更新