Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我在JPanel上绘制背景图像时,它在Windows下的行为与在Linux下的不同_Java_Swing_Paintcomponent_Drawimage - Fatal编程技术网

Java 当我在JPanel上绘制背景图像时,它在Windows下的行为与在Linux下的不同

Java 当我在JPanel上绘制背景图像时,它在Windows下的行为与在Linux下的不同,java,swing,paintcomponent,drawimage,Java,Swing,Paintcomponent,Drawimage,我正在为工作开发一个程序(注意:我不能共享完整的代码,因为它在很大程度上是受保护的工作产品,但我将尽我所能共享所有代码)。在应用程序中,我有一个JPanel,其中应用了背景图像。其中一些面板还附带了鼠标侦听器&我的管理层希望有一个可视的线索,可以单击面板来启动操作。为此,我将一个透明的JPanel与背景图像叠加在JPanel的顶部,并在其上附加一个鼠标侦听器,以关闭鼠标插入/退出的事件。当鼠标进入图像面板时,覆盖面板将从透明切换到半透明,并在鼠标退出时返回 在Linux下,这一点非常有效。在Wi

我正在为工作开发一个程序(注意:我不能共享完整的代码,因为它在很大程度上是受保护的工作产品,但我将尽我所能共享所有代码)。在应用程序中,我有一个JPanel,其中应用了背景图像。其中一些面板还附带了鼠标侦听器&我的管理层希望有一个可视的线索,可以单击面板来启动操作。为此,我将一个透明的JPanel与背景图像叠加在JPanel的顶部,并在其上附加一个鼠标侦听器,以关闭鼠标插入/退出的事件。当鼠标进入图像面板时,覆盖面板将从透明切换到半透明,并在鼠标退出时返回

在Linux下,这一点非常有效。在Windows下。。。幸好我是秃头,所以我不能把头发扯下来。似乎正在发生的是,当我移动鼠标时,某种类型的图像缓存正在发生,而mouseEnter事件导致鼠标在一秒钟前的任何内容都被绘制到框架中;i、 e.如果我将鼠标放在GUI上附近的按钮上,然后将鼠标放在面板上,我将看到按钮与周围的GUI一起出现在面板中

图像面板包含在不透明的JInternalFrame中

另一件需要注意的事情是,如果我在应用程序中做了一些会导致图像更改的事情(例如,从JComboBox中进行新的选择),则图像会按预期重新绘制。不管问题是什么,它似乎与突出显示和图像如何重新绘制有关

我不应该为Windows做什么

提前谢谢

。Start.png是面板打开时在两个操作系统中的外观。GoodMouseEnter.png是Linux下mouseEnter事件的样子。BadMouseEnter.png和badMouseExit.png是Windows下的外观

这是我用来创建图像面板的类(编辑:这个示例是自包含的):

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Toolkit;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.image.buffereImage;
导入java.awt.image.ImageObserver;
导入java.io.IOException;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类图像测试{
JFrame frm=null;
ImagePanel imgP=null;
publicstaticvoidmain(字符串[]args)引发畸形的DurLexException
{
ImageTest it=新的ImageTest();
it.initialize();
}
public void initialize()引发畸形的DurException
{
String path=“file:/C:/CylinderTank.png”;
URL imagePath=新URL(路径);
System.out.println(imagePath.toString());
frm=新的JFrame();
imgP=新的ImagePanel(真);
int fW=500;
int fH=700;
int pW=450;
int pH=650;
frm.setLayout(空);
frm.setPreferredSize(新尺寸(fW,fH));
frm.设置尺寸(fW、fH);
imgP.getFilterPanel().addMouseListener(新的PanelListener());
imgP.使用定制尺寸(pW,pH);
imgP.setImageURL(imagePath);
imgP.立根(0,0,pW,pH);
frm.add(imgP);
frm.pack();
frm.setVisible(真);
}
私有类PanelListener实现MouseListener{
公共PanelListener(){}
@凌驾
公共无效mouseClicked(MouseEvent e){}
@凌驾
public void mousePressed(MouseEvent e){}
@凌驾
公共无效MouseEvent e{}
@凌驾
公共无效鼠标事件(鼠标事件e)
{
imgP.highlightImage(真);
imgP.repaint();
}
@凌驾
公共无效mouseExited(MouseEvent e)
{
imgP.highlightImage(假);
imgP.repaint();
}
}    
}
@抑制警告(“串行”)
类ImagePanel扩展JPanel实现ImageObserver{
私人最终JPanel filterPanel;
私有缓冲图像;
私人规模;
私人最终工具包;
private boolean highlight=false;
专用URL图像路径;
私人int imgW、imgH;
私有最终颜色blueFilter=新颜色(0,0,255,38);
私有最终颜色redFilter=新颜色(255,0,0,38);
专用最终颜色绿色过滤器=新颜色(0,255,0,38);
专用最终颜色清除=新颜色(0,0,0,0);
专用最终颜色bgColor=新颜色(116、169、255、255);
私有布尔值customSize=false;
公共图像面板(布尔不透明)
{
超级();
this.kit=Toolkit.getDefaultToolkit();
setLayout(空);
设置不透明(不透明);
挫折背景(bgColor);
filterPanel=新的JPanel();
过滤板后退地面(清除);
}
公共图像面板(URL图像路径,布尔不透明)
{
超级();
this.imagePath=imagePath;
this.kit=Toolkit.getDefaultToolkit();
setLayout(空);
设置不透明(不透明);
挫折背景(bgColor);
filterPanel=新的JPanel();
过滤板后退地面(清除);
readImage();
}
@凌驾
受保护组件(图形g)
{
Graphics2D g2D=(Graphics2D)g;
如果(突出显示)
过滤器面板立根地面(蓝过滤器);
其他的
过滤板后退地面(清除);
int X=0,Y=0;
如果(图像!=null)
{
image.flush();
试剂盒准备图像(图-1,-1,本);
如果(自定义大小)
{
X=(面板尺寸.宽度-imgW)/2;
Y=(面板尺寸.高度-imgH)/2;
}
if(isOpaque())
g2D.drawImage(图像,X,Y,bgColor,this);
其他的
g2D.drawImage(图像,X,Y,this);
}
其他的
超级油漆组件(g2D);
}
公共空白高光图像(布尔高光)
{
high=highlight;
}
私有void readImage()
{
尝试
{
image=ImageIO.read(imagePath);
imgW=image.g
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageTest {
JFrame frm = null;
ImagePanel imgP = null;

public static void main(String[] args) throws MalformedURLException 
{
    ImageTest it = new ImageTest();
    it.initialize();
}

public void initialize() throws MalformedURLException
{
    String path = "file:/C:/CylinderTank.png";
    URL imagePath = new URL(path);
    System.out.println(imagePath.toString());
    frm = new JFrame();
    imgP = new ImagePanel(true);
    int fW = 500;
    int fH = 700;
    int pW = 450;
    int pH = 650;

    frm.setLayout(null);
    frm.setPreferredSize(new Dimension(fW,fH));
    frm.setSize(fW,fH);

    imgP.getFilterPanel().addMouseListener(new PanelListener());
    imgP.useCustomSizing(pW, pH);
    imgP.setImageURL(imagePath);
    imgP.setBounds(0, 0, pW, pH);

    frm.add(imgP);

    frm.pack();
    frm.setVisible(true);
}

private class PanelListener implements MouseListener {

    public PanelListener() {        }
    @Override
    public void mouseClicked(MouseEvent e) {        }
    @Override
    public void mousePressed(MouseEvent e) {        }
    @Override
    public void mouseReleased(MouseEvent e) {        }
    @Override
    public void mouseEntered(MouseEvent e) 
    {
        imgP.highlightImage(true);
        imgP.repaint();
    }
    @Override
    public void mouseExited(MouseEvent e) 
    {
        imgP.highlightImage(false);
        imgP.repaint();
    }
}    
}



@SuppressWarnings("serial")
class ImagePanel extends JPanel implements ImageObserver {
private final JPanel filterPanel;
private BufferedImage image;
private Dimension panelSize;
private final Toolkit kit;
private boolean highlight = false;
private URL imagePath;
private int imgW, imgH;
private final Color blueFilter = new Color(0, 0, 255, 38);
private final Color redFilter = new Color(255, 0, 0, 38);
private final Color greenFilter = new Color(0, 255, 0, 38);
private final Color clear = new Color(0, 0, 0, 0);
private final Color bgColor = new Color(116, 169, 255, 255);
private boolean customSize = false;

public ImagePanel(boolean opaque)
{
    super();
    this.kit = Toolkit.getDefaultToolkit();
    setLayout(null);
    setOpaque(opaque);
    setBackground(bgColor);
    filterPanel = new JPanel();
    filterPanel.setBackground(clear);
}

public ImagePanel(URL imagePath, boolean opaque)
{
    super();
    this.imagePath = imagePath;
    this.kit = Toolkit.getDefaultToolkit();
    setLayout(null);
    setOpaque(opaque);
    setBackground(bgColor);
    filterPanel = new JPanel();
    filterPanel.setBackground(clear);

    readImage();

}

@Override
protected void paintComponent(Graphics g)
{
    Graphics2D g2D = (Graphics2D) g;

    if (highlight)
        filterPanel.setBackground(blueFilter);
    else
        filterPanel.setBackground(clear);

    int X = 0, Y = 0;
    if (image != null)
    {
        image.flush();
        kit.prepareImage(image, -1, -1, this);

        if (customSize)
        {
            X = (panelSize.width - imgW) / 2;
            Y = (panelSize.height - imgH) / 2;
        }

        if (isOpaque())
            g2D.drawImage(image, X, Y, bgColor, this);
        else
            g2D.drawImage(image, X, Y, this);
    }
    else
        super.paintComponent(g2D);
}

public void highlightImage(boolean highlight)
{
    this.highlight = highlight;

}

private void readImage()
{
    try
    {
        image = ImageIO.read(imagePath);
        imgW = image.getWidth();
        imgH = image.getHeight();

        if (customSize)
            panelSize = getPreferredSize();
        else
            panelSize = new Dimension(imgW, imgH);

        setPreferredSize(panelSize);
        setMinimumSize(panelSize);
        setMaximumSize(panelSize);

        int X = (panelSize.width - imgW) / 2;
        int Y = (panelSize.height - imgH) / 2;
        filterPanel.setBounds(X, Y, imgW, imgH);

        add(filterPanel);
    }
    catch (IOException ex)  
    {
        Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex);
    }
}


public void setImageURL(URL img)
{
    this.imagePath = img;
    readImage();
}

public Dimension getDisplayedImageSize()
{
    if (image == null)
        return null;

    return new Dimension(imgW, imgH);
}

public JPanel getFilterPanel()
{
    return filterPanel;
}

public void useCustomSizing(int W, int H)
{
    if (W < 0)
        W = getPreferredSize().width;
    if (H < 0)
        H = getPreferredSize().height;

    if ((W>0) || (H>0))
        customSize = true;

    Dimension cDim = new Dimension(W,H);
    setPreferredSize(cDim);
    setMinimumSize(cDim);
    setMaximumSize(cDim);

    repaint();
}
}//end class ImagePanel
@Override
protected void paintComponent(Graphics g) {
    Graphics2D g2D = (Graphics2D) g;
    super.paintComponent(g2D);

    int X = 0, Y = 0;
    if (image != null) {

        if (customSize) {
            X = (panelSize.width - imgW) / 2;
            Y = (panelSize.height - imgH) / 2;
        }

        g2D.drawImage(image, X, Y, this);
    }


    if (highlight) {
        g2D.setColor(blueFilter);
        g2D.fillRect(X, Y, image.getWidth(), image.getHeight());
    }

}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MouseOverTest {

    public static void main(String[] args) {
        new MouseOverTest();
    }

    public MouseOverTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                try {
                    BufferedImage background = ImageIO.read(new File("C:\\hold\\thumbnails\\_MTCGAC__Pulling_Cords_by_Dispozition.png"));

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane(background));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException exp) {
                    exp.printStackTrace();
                }
            }
        });
    }

    public static class TestPane extends JPanel {

        protected static final Color BLUE_FILTER = new Color(0, 0, 255, 38);

        private BufferedImage background;
        private Rectangle imageBounds;
        private boolean mouseInTheHouse;

        public TestPane(BufferedImage background) {
            this.background = background;
            MouseAdapter ma = new MouseAdapter() {
                @Override
                public void mouseMoved(MouseEvent e) {
                    mouseInTheHouse = getImageBounds().contains(e.getPoint());
                    repaint();
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    mouseInTheHouse = false;
                    repaint();
                }

            };
            addMouseMotionListener(ma);
            addMouseListener(ma);
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? new Dimension(200, 200) : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        public void invalidate() {
            imageBounds = null;
            super.invalidate();
        }

        protected Rectangle getImageBounds() {

            if (imageBounds == null) {

                if (background != null) {

                    int x = (getWidth() - background.getWidth()) / 2;
                    int y = (getHeight() - background.getHeight()) / 2;
                    imageBounds = new Rectangle(x, y, background.getWidth(), background.getHeight());

                } else {

                    imageBounds = new Rectangle(0, 0, 0, 0);

                }

            }

            return imageBounds;

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            Rectangle bounds = getImageBounds();
            if (background != null) {
                g2d.drawImage(background, bounds.x, bounds.y, this);
            }
            if (mouseInTheHouse) {
                g2d.setColor(BLUE_FILTER);
                g2d.fill(bounds);
            }
            g2d.dispose();
        }

    }

}