- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将图像添加到 JPanel 中,JPanel 位于 JInternalFrame 内部,并且 JInternalFrame 有一个父级 JDesktopPane。
我尝试使用另一个类从路径添加图像,然后 jPanel1 = new Imagen(<String FilePath>);
,该类将在窗口构造函数中接收字符串中的路径,但它不起作用。我尝试过自定义 initComponents()
中的代码,行 jPanel1 = javax.swing.JPanel();
并将这一行替换为 jPanel1 = new Imagen(); ,构造函数将接收的参数是图像文件的路径,并且此方法工作正常,但它只运行一次(在 initComponents() 方法内),我不能(或者我不知道)如何替换 JPanel 中的图像。 :(
该项目首先从一个 JDesptopPane 开始,然后是一个 JInternalFrame (1),从这个内部框架,它显示其他 JInternalFrame(2),从这个内部框架,它显示其他 JInternalFrame(3),在内部框架 3 中,我想要要使用按钮、JFileChooser、图像以及文件选择器接收的路径进行查找,我想将其设置为 Imagen() 类中的参数。并将图像设置到内置于 JInternalFrame(3) 中的 JPanel 中。
编辑1:感谢您的评论。这里是窗口构造函数 JInternalFrame(3) 的代码:
public AgregarContacto() {
JFileChooser jf = new JFileChooser();
jf.setDialogTitle("Elija el archivo de Imagen");
int i = jf.showOpenDialog(null);
if (i == JFileChooser.APPROVE_OPTION) {
default1 = jf.getSelectedFile().getAbsolutePath();
}
initComponents();
jPanel1= new Imagen(default1);
for (String llenarMese : p.llenarMeses()) {
Mes.addItem(llenarMese);
}
for (String llenarDia : p.llenarDias31()) {
Dia.addItem(llenarDia);
}
for (String llenarAnios : p.Anios()) {
Anio.addItem(llenarAnios);
}
}
这里是类 Imagen() 的代码,它将在构造函数中接收一个字符串:
public class Imagen extends JPanel {
String ruta;
private BufferedImage imag;
public Imagen(String path){
ruta = path;
try{
imag = ImageIO.read(new File("unknown.png"));
}catch(IOException ex){
JOptionPane.showMessageDialog(null, "Error " + ex.getMessage());
}
}
@Override
public void paint(Graphics g){
super.paint(g);
Image Scaledimage = imag.getScaledInstance(this.getWidth(), this.getHeight(), Image.SCALE_SMOOTH);
g.drawImage(Scaledimage, 0, 0, null);
}
}
最佳答案
有很多种方法可以做到这一点,但是,更可取的方法之一是为 ImagePane
提供更改其显示的图像的能力,而无需创建新的图像它的一个实例。
这样,您只需向 ImagePane
传递对要加载的图像的引用并让它完成其工作
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.filechooser.FileFilter;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JDesktopPane dp = new JDesktopPane() {
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 600);
}
};
JInternalFrame inFrm = new JInternalFrame("Image", true, true, true, true);
inFrm.add(new ShowImagePane());
inFrm.pack();
inFrm.setVisible(true);
dp.add(inFrm);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(dp);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ShowImagePane extends JPanel {
private JFileChooser fc;
public ShowImagePane() {
setLayout(new BorderLayout());
ImagePane imagePane = new ImagePane();
add(imagePane);
JButton open = new JButton("Open...");
open.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (fc == null) {
fc = new JFileChooser();
fc.addChoosableFileFilter(new FileFilter() {
@Override
public boolean accept(File f) {
String name = f.getName().toLowerCase();
return name.endsWith(".png")
|| name.endsWith(".jpg")
|| name.endsWith(".jpeg")
|| name.endsWith(".bmp");
}
@Override
public String getDescription() {
return "Images";
}
});
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
fc.setMultiSelectionEnabled(false);
}
switch (fc.showOpenDialog(ShowImagePane.this)) {
case JFileChooser.APPROVE_OPTION:
File selected = fc.getSelectedFile();
try {
imagePane.setImageSource(selected);
} catch (IOException ex) {
ex.printStackTrace();
}
break;
}
}
});
add(open, BorderLayout.SOUTH);
}
}
public class ImagePane extends JPanel {
private BufferedImage bgImage;
private Image scaled;
public ImagePane(File source) throws IOException {
setImageSource(source);
}
public ImagePane() {
}
@Override
public void invalidate() {
super.invalidate();
resizeImage();
}
public void setImageSource(File source) throws IOException {
if (source != null) {
bgImage = ImageIO.read(source);
resizeImage();
} else {
bgImage = null;
}
}
@Override
public Dimension getPreferredSize() {
return bgImage == null ? new Dimension(200, 200) : new Dimension(bgImage.getWidth(), bgImage.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (scaled != null) {
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - scaled.getWidth(this)) / 2;
int y = (getHeight() - scaled.getHeight(this)) / 2;
g2d.drawImage(scaled, x, y, this);
g2d.dispose();
}
}
protected void resizeImage() {
if (bgImage != null) {
if (getWidth() < getHeight()) {
scaled = bgImage.getScaledInstance(this.getWidth(), -1, Image.SCALE_SMOOTH);
} else {
scaled = bgImage.getScaledInstance(-1, getHeight(), Image.SCALE_SMOOTH);
}
repaint();
}
}
}
}
Image#getScaledInstance
既不是最快的,更重要的是,也不是质量最好的缩放算法。由于重新缩放图像可能需要一些时间,因此您应该仅在必要时才执行此操作。
看看Java: maintaining aspect ratio of JPanel background image和 Quality of Image after resize very low -- Java了解更多细节和想法
关于java - 将图像添加到 JInternalFrame 内的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314681/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!