好了,我再来一次。
我有一个JPanel,我在上面重写了<code>paintComponent()
我可以从按钮获取输入,就好像它确实存在一样,但它实际上并没有显示出来,而它在标准JPanel上显示出来。下面是一个例子。
提前感谢您的任何帮助。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Test {
public static void main (String[] args){
final JFrame frame = new JFrame();
DrawPanel panel1 = new DrawPanel(createBufferedImage("background.png"));
JPanel panel2 = new JPanel();
DrawButton button1 = new DrawButton(createBufferedImage("button.png"));
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
JOptionPane.showMessageDialog(frame, "input detected, button1");
}
});
DrawButton button2 = new DrawButton(createBufferedImage("button.png"));
button2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
JOptionPane.showMessageDialog(frame, "input detected, button2");
}
});
panel1.add(button1);
panel2.add(button2);
frame.getContentPane().add(panel1, BorderLayout.NORTH);
frame.getContentPane().add(panel2, BorderLayout.CENTER);
frame.validate();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
protected static BufferedImage createBufferedImage(String path){
File img = new File(path);
BufferedImage bi = null;
try{
bi = ImageIO.read(img);
}
catch (IOException ioe){
throw new RuntimeException();
}
BufferedImage newImage = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = newImage.createGraphics();
g2d.drawImage(bi, 0, 0, null);
g2d.dispose();
return newImage;
}
}
class DrawPanel extends JPanel{
private BufferedImage bg;
public DrawPanel(BufferedImage bg){
this.bg = bg;
new JPanel();
setPreferredSize(new Dimension(bg.getWidth(), bg.getHeight()));
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(bg, 0, 0, null);
g.dispose();
}
}
class DrawButton extends JButton{
private BufferedImage bi;
public DrawButton(BufferedImage bi){
setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight()));
this.bi = (BufferedImage) bi;
setContentAreaFilled(false);
}
@Override
public Dimension getPreferredSize(){
return new Dimension(bi.getWidth(), bi.getHeight());
}
public BufferedImage getIconImage(){
return bi;
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(bi, 0, 0, null);
g.dispose();
}
}
永远不要对JVM给你的图形对象调用dispose,只能对你自己创建的图形对象调用dispose。
所以这是可以的:
BufferedImage newImage = new BufferedImage(bi.getWidth(), bi.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = newImage.createGraphics();
g2d.drawImage(bi, 0, 0, null);
g2d.dispose();
但这不是:
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(bg, 0, 0, null);
g.dispose();
}
JVM可能(很可能)需要使用该对象进行进一步的绘制,包括绘制容器的子组件,如果您处理掉它,就可以防止这种情况发生。
另一个建议是:考虑重写getPreferredSize,而不是setPreferredSize。所以与其这样:
setPreferredSize(new Dimension(bg.getWidth(), bg.getHeight()));
考虑:
@Override
public Dimension getPreferredSize() {
if (bg == null) {
return super.getPreferredSize();
} else {
return new Dimension(bg.getWidth(), bg.getHeight());
}
}
这样,组件的首选大小被可靠地设置,组件的任何用户都不能更改它。
问题内容: 由于某些未知原因,iPad Safari不会显示很长的背景图像。在 我的示例中 ,背景图像为1,000 x 10,000像素。相同的示例适用于任何桌面浏览器,例如Safari,Firefox等。 我知道CSS中的,但不幸的是,它不适用于我的特定情况。 问题答案: Mobile Safari对其在进行二次采样之前将显示的背景图像大小有限制,由于背景的大小,您可能会遇到此问题: 对于具有小
我正在尝试加载存储在应用程序文件夹上的图像当我打开活动时,我从logcat收到了这个错误: 1-20 01:30:40.125 14331-14331/mx.eusaga。af W/ImageView:无法打开内容:content://mx.eusaga.af.fileprovider/imagenes/1-db384fa8-f28b-4595-abbf-d45d38fd4036.jpgjava.
我有一个kmz文件,其中包含一个在Google地球中排列然后导出为kmz文件的图像。图像在Google地球中完美排列,但当KMZ在Google地图中显示为叠加时,图像会倾斜并且不再与下面的基础层正确对齐。它们似乎旋转不正确。 这似乎是Google地球和Google地图之间使用的不同投影的问题?在加载Google地图中的覆盖层时是否有解决方案可以纠正此问题? KML片段(来自评论,可读):
我的问题是:我在JPanel中显示了一个JLabel的数组列表和一个JPanel的按钮,当我按下按钮时,我想在JLabel的上方显示我的JPanel。但是当我按下按钮时,我的JPanel在标签下面。 请不要告诉我使用JLayerPane,因为如果我可以不用它,那将是最好的。感谢您的解决方案。 这是我的代码的一个例子:要运行这个,请在这里找到图像100x100: http://www.html5ga
我无法上载firebase存储上的配置文件图像。我正在把烤面包片上的错误打印出来。为什么会出现这种情况?我无法解决这个问题,我审查了我的代码很多次。问题可能是什么?我如何调整我的代码以使其正常工作?提前向大家表示感谢。