gpt4 book ai didi

java - 在 1 个 JPanel 中绘制 2 个图像

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:42:20 24 4
gpt4 key购买 nike

我想在 2 个 JScrollPanes 之间画线(第一个滚动 Pane 在左侧,第二个在右侧)。这些 JScrollPanes 包含图像。我想在这两个图像之间画线(使用一些图层,使用一些技巧等)。我尝试用不同的方式来做,但我失败了。是否可以? (如果没有,我将不得不在一个 JScrollPane 中制作 2 张图片,这不会很好)。

编辑

我想在 2 个图像之间绘制 - 通过组件 - 从图像中获取一些点并在它们之间画线。对于表述不当的问题,我深表歉意。

最佳答案

为了实现这一点,我相信您需要使用 Glass PaneGlass Pane 位于 JRootPane 中所有内容的顶部并填充整个 View 。这个特殊的位置允许两种不同的能力:

  • 拦截鼠标和键盘事件
  • 绘制整个用户界面

我相信您的问题已由第二种功能解决。以下是一个示例实现,您可以稍后对其进行调整以满足您自己的需要。请注意,我遗漏了很多关于 Glass Pane 的细节,您需要自己研究这些细节。

代码

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GlassPaneDemo {
private static BufferedImage bi;

public static void main(String[] args){
try {
loadImages();

SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
createAndShowGUI();
}
});
} catch (IOException e) {
// handle exception
}
}

private static void loadImages() throws IOException{
bi = ImageIO.read(new File("src/resources/person.png"));
}

private static void createAndShowGUI(){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setGlassPane(new CustomGlassPane());
frame.getContentPane().add(getButtonPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.getGlassPane().setVisible(true);
frame.setVisible(true);
}

private static final JPanel getButtonPanel(){
@SuppressWarnings("serial")
final JPanel panel = new JPanel(){
@Override
protected void paintComponent(Graphics g){
Graphics gCopy = g.create();

gCopy.setColor(Color.BLUE.darker());
gCopy.fillRect(0, 0, getWidth(), getHeight());

gCopy.dispose();
}
};

final JLabel labelOne = new JLabel();
labelOne.setIcon(new ImageIcon(bi));
final JLabel labelTwo = new JLabel();
labelTwo.setIcon(new ImageIcon(bi));
panel.add(labelOne);
panel.add(labelTwo);

return panel;
}

@SuppressWarnings("serial")
private static class CustomGlassPane extends JComponent{
private Point p1;
private Point p2;
private boolean lineDrawn;

public CustomGlassPane(){
addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
if(p1 == null || lineDrawn){
if(lineDrawn){
p1 = null;
p2 = null;
lineDrawn = false;
}
p1 = e.getPoint();
}else{
p2 = e.getPoint();
repaint(); // not optimal
lineDrawn = true;
}
}
});

// Block all other input events
addMouseMotionListener(new MouseMotionAdapter(){});
addKeyListener(new KeyAdapter(){});
addComponentListener(new ComponentAdapter(){
@Override
public void componentShown(ComponentEvent e){
requestFocusInWindow();
}
});
setFocusTraversalKeysEnabled(false);
}

@Override
protected void paintComponent(Graphics g){
if(p1 != null && p2 != null){
Graphics2D g2 = (Graphics2D) g.create();

g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.RED);
g2.drawLine((int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY());

g2.dispose();
}
}
}
}

输出

enter image description here

解释

在这个例子中,我点击了每个 JLabel 中的任意两个点,然后画了一条连接线。

关于java - 在 1 个 JPanel 中绘制 2 个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6609888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com