我有JPanel一个JFrame.我在上面加了一张图片,JPanel但它只显示了图片的一部分:这是代码的一部分,我做了它:
JPanel panelImg = new JPanel()
{
public void paintComponent(Graphics g)
{
Image img = new ImageIcon("Welcome.png").getImage();
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
g.drawImage(img, 0, 0, null);
}
};
mainFrame.add(panelImg);
Run Code Online (Sandbox Code Playgroud)
所以这就是它的样子:

完整的图片如下所示:

有没有办法将图片缩放到JFrames尺寸?提前致谢
我想设计一个启动画面,可以通过进度条显示当前的加载过程,就像netbeans启动画面一样,如图所示
loading... modules, done!.... loading modules and so on
Run Code Online (Sandbox Code Playgroud)
加载完成后,主应用程序出现了.
我已经阅读了许多与仅创建启动画面相关的文章,但没有一篇文章涉及如何在启动画面上显示不同后台任务的进度.
我怎样才能做到这一点?
我可以将javafx 2用于启动画面,而应用程序的其余部分是使用java编写的
解决了!
我终于成功了. 我的错误是我正在更新任务线程中的GUI内容,因此我的任务线程被阻止,并且在GUI更新指令后无法执行下一条指令.现在,我在任务完成后移动了那些更新GUI指令,并且它正在工作....感谢Jewelsea走正确的道路.
我正在整理一个幻灯片程序,用于衡量用户在每张幻灯片上花费的时间.幻灯片演示了几个不同的魔术技巧.每个技巧都会显示两次.在重复之间显示临时图像.在每个技巧之间显示过渡图像.
在第一次重复技巧时,在显示下一个图像之前,点击后,JPanel颜色在屏幕上闪烁.在第二次重复相同的技巧期间不会发生这种情况.图像可能需要很长时间才能加载.
是否有一种简单的方法来预加载图像,以便第一次没有延迟?
NOTE: Original code deleted.
Run Code Online (Sandbox Code Playgroud)
编辑2013年1月10日:此代码现在适用于较慢的计算机.trashgod的第二个附录帮助最多.mouseClick控件结构定期要求SwingWorker类加载40个或更少的当前技巧,同时还将使用过的图像设置为null.我已经将我的代码简化为两个Image []并添加了一个main方法,因此它是独立的.仍然需要运行图像.现在这是非常简单的代码,如果你想用大量图片制作幻灯片,我认为这将是一个很好的起点.
注意:我想我在使用多个Image []时想出了如何正确实现SwingWorker.trashgod和kleopatra这个实现符合你的建议吗?我最终没有使用发布和进程,因为我无法弄清楚如何使用索引数组正常工作,但因为StringWorker没有加载数组中的所有图像(只有40)和代码调用StringWorker每20个图像,应该有一个相当不错的缓冲区.
编辑1/10/2013通过在Mouse类上扩展MouseAdapter来改变MouseListener.还修复了我的paintComponent方法,以包含对super.paintComponent(g)的调用.向我的SwingWorker类ImageWorker添加了发布/处理方法.添加了一个包装类ArrayWrapper,允许传递imageArray [i]及其相应的索引int i,并使用publish进行处理.
package slideshow3;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.List;
public class SlideShow3 extends JFrame
{
//screenImage will be replaced with each new slide
private Image screenImage;
private int width;
private int height;
//Create panel for displaying images using paintComponent()
private SlideShow3.PaintPanel mainImagePanel;
//Used for keybinding
private Action escapeAction;
//Image array variables for each trick
private …Run Code Online (Sandbox Code Playgroud) 我想使用Java的Area类(java.awt.geom.Area)在各种多边形上执行减法和交集操作.
在许多这些情况下,减法操作可以将源区域分成两部分.在这些情况下,我需要返回两个Area对象,每个对象用于由减法操作创建的每个结果连续部分.
在阅读了Area类的JavaDocs之后,我似乎没有找到任何方法来返回Area的连续部分.事实上,我甚至不确定Area如何处理这种情况.
如何通过Area的减法或交叉方法获得所有生成的连续区域?
谢谢,-Cody
编辑:请参阅此答案的评论以回答此问题.TLDR:瓶颈是缩放图像,但分析显示这是ImageIcon构造函数中的一个问题.
$ java -version
Picked up _JAVA_OPTIONS: -Dswing.aatext=true -Dawt.useSystemAAFontSettings=on
java version "1.7.0_45"
OpenJDK Runtime Environment (IcedTea 2.4.3) (ArchLinux build 7.u45_2.4.3-1-x86_64)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
Run Code Online (Sandbox Code Playgroud)
我的应用程序在启动时加载1,380个图标.加载代码如下所示.使用SSD磁盘,ImageIcon构造函数调用实际上比磁盘读取更昂贵(尽管磁盘读取可能使用一些缓存...)
加载图标需要5.4s,在ImageIcon构造函数中花费3.2s.
有没有办法加快ImageIcon构建或使用其他东西?
private ImageIcon setIcon(LogicalIcon iconInfo, int size) {
ImageIcon icon = iconImages.get(iconInfo.getIconName());
if(icon == null) {
BufferedImage image = null;
try {
image = ImageIO.read(getBestPreviewIcon(iconInfo).getFile());
icon = new ImageIcon(ImageUtils.scaleDownTo(image, new Dimension(size, size)));
iconImages.put(iconInfo.getIconName(), icon);
} catch (IOException e) {
// FIXME: Add a "Missing Image" icon
e.printStackTrace();
}
}
setIcon(icon); …Run Code Online (Sandbox Code Playgroud) 我对BufferedImage和JPanel有点小问题.我正在创建一个带有2D动画的游戏.
基本上我有一个animationHandler,它将遍历图片,并根据旋转也将正确显示它.但问题是 - 当我加载图片时,我的Jpanel不会画任何东西.如果我注释掉自定义绘制方法,那么事件并不重要 - paintComponent方法不会绘制任何东西,而且它似乎跳过了paintCompontent方法.即使游戏没有崩溃并且计时器仍在运行 - 它也不会在扩展的JPanel中使用paintComponent方法.
包含计时器的类 - 通过JPanel.repaint()调用JPanel;
这是loadImg方法
/**
* Test method to check animationHandler and bufferedImgs
*/
private void loadImages() {
BufferedImage b_1;
BufferedImage b_2;
BufferedImage b_3;
BufferedImage b_4;
BufferedImage b_5;
BufferedImage[] imgs = new BufferedImage[5];
try {
b_1 = ImageIO.read(new File("warlock1.png"));
b_2 = ImageIO.read(new File("warlock2.png"));
b_3 = ImageIO.read(new File("warlock3.png"));
b_4 = ImageIO.read(new File("warlock4.png"));
b_5 = ImageIO.read(new File("warlock5.png"));
imgs[0] = b_1;
imgs[1] = b_2;
imgs[2] = b_3;
imgs[3] = b_4;
imgs[4] = b_5;
animationHandler.addAnimation(imgs);
} …Run Code Online (Sandbox Code Playgroud) 问题已解决!!!!!! 非常感谢trashgod和HoverCraftFullOfEels!我终于通过使用下面的例子并略微改变它来获得这个概念.更改允许缩放进度条(默认为100个单位).再次感谢您的耐心和愿意为此而努力.意味着很多人,~Kyte
ps - + 1全部'围绕:)
/** @see http://stackoverflow.com/questions/4637215 */
public class Threading_01 extends JFrame {
private static final String s = "0.00";
private JProgressBar progressBar = new JProgressBar(0, 100);
private JLabel label = new JLabel(s, JLabel.CENTER);
public Threading_01() {
this.setLayout(new GridLayout(0, 1));
this.setTitle("?2");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(progressBar);
this.add(label);
this.setSize(161, 100);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void runCalc() {
// progressBar.setIndeterminate(true);
TwoWorker task = new TwoWorker();
task.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
if ("progress".equals(e.getPropertyName())) {
progressBar.setIndeterminate(false);
progressBar.setValue((Integer) e.getNewValue());
System.out.println("**: " …Run Code Online (Sandbox Code Playgroud) 我想要一个添加ToolTip到自定义MapMarker的JMapViewer。但是,取消搜索并不能帮助我解决这个问题。
自定义MapMarker为:
public class MapMarkerUnit extends MapObjectImpl implements MapMarker
Run Code Online (Sandbox Code Playgroud)
绘制方法的覆盖是
public void paint(Graphics g, Point position, int radio) {
String filename = "marker.png";
//System.out.print(filename);
BufferedImage x = null;
try {
x = ImageIO.read(getClass().getResource(filename));
} catch (IOException ex) {
Logger.getLogger(MapMarkerUnit.class.getName()).log(Level.SEVERE, null, ex);
}
g.drawImage(x, position.x-16, position.y-37,null);
//if(getLayer()==null||getLayer().isVisibleTexts()) paintText(g, new Point(position.x+20,position.y));
}
Run Code Online (Sandbox Code Playgroud)
感谢您提供的任何帮助。
java ×8
swing ×5
image ×2
jpanel ×2
swingworker ×2
area ×1
awt ×1
geometry ×1
javafx-2 ×1
jframe ×1
jmapviewer ×1
jprogressbar ×1
performance ×1
slideshow ×1