2013-06-12 69 views
0

我使用相对平淡的纹理创建了一个背景(它重复得很好,所以这是一种奖励)。但是,最重要的是,我试图在随机位置添加两个图像,每个图像五次。所以,我试过了本 -基于随机整数重复图像

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Insets; 
import java.io.File; 
import java.io.IOException; 
import java.util.Random; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class RepeatDiagonals { 

    public static Image whiteOverlayStreak; 
    public static Image blackOverlayStreak; 
    public static JFrame framePanel; 
    public static DiagonalImages diagTest; 

    public static void createAndInitGUI() { 
     diagTest = new DiagonalImages(); 

     framePanel = new JFrame("Diagonal Testing"); 
     framePanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     framePanel.setPreferredSize(new Dimension(1020, 720)); 
     framePanel.add(diagTest); 
     framePanel.pack(); 
     framePanel.setVisible(true); 

    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 

       createAndInitGUI(); 

      } // public void run() Closing 
     }); // SwingUtilities Closing 
    } 
} 


// TODO Add in constructor for better image import 
class DiagonalImages extends JPanel { 

    public static final String IMAGE_PATH_WHITESTREAK = "imageFolder/whiteBackgroundStreakOverlay.png"; 
    public static final String IMAGE_PATH_BLACKSTREAK = "imageFolder/blackBackgroundStreakOverlay.png"; 
    public static Image whiteOverlayStreak; 
    public static Image blackOverlayStreak; 
    public static Image overlayStreak; 

    DiagonalImages() { 
     loadImages(); 
     setVisible(true); 
     setOpaque(false); 
    }; 

    public void loadImages() { 
     try { 
      whiteOverlayStreak = ImageIO.read(new File(IMAGE_PATH_WHITESTREAK)); 
      blackOverlayStreak = ImageIO.read(new File(IMAGE_PATH_BLACKSTREAK)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 

     Dimension size = this.getSize(); 
     Insets insets = this.getInsets(); 

     int w = size.width - insets.left - insets.right; 
     int h = size.height - insets.top - insets.bottom; 

     Random randomInteger = new Random(); 
     randomInteger.nextInt(900); 


     for (int i = 0; i < 3; i++) { 

      int x = randomInteger.nextInt() % w; 
      int y = randomInteger.nextInt() % h; 

      g2d.drawImage(blackOverlayStreak, x, y, null); 
     } 

     for (int i2 = 0; i2 < 5; i2++){ 
      int x2 = randomInteger.nextInt() % w; 
      int y2 = randomInteger.nextInt() % h; 

      g2d.drawImage(whiteOverlayStreak, x2, y2, null); 
     } 
    } 
} 

主代码的相关部分:

// Makes the Initial BorderLayout 
     allContent = new ImagePanel(image); 
     allContent.setLayout(new BorderLayout()); 
     allContent.add(new DiagonalImages()); 
     allContent.add(tabbedPane, BorderLayout.CENTER); 
     allContent.add(logoImage, BorderLayout.NORTH); 
     allContent.setVisible(true); 
     allContent.setOpaque(false); 

     // Add ScrollPane 
     scrollPane = new JScrollPane(allContent); 
     scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     scrollPane.getVerticalScrollBar().setUnitIncrement(10); 
     scrollPane.setOpaque(false); 
     scrollPane.getViewport().setOpaque(false); 
     scrollPane.setBorder(new EmptyBorder(0, 0, 0, 0)); 
     scrollPane.setWheelScrollingEnabled(true); 

     // JFrame programFrame Constructors 
     programFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     programFrame.setLayout(new BorderLayout()); 
     programFrame.add(scrollPane); 
     programFrame.pack(); 
     programFrame.setVisible(true); 
     programFrame.setResizable(true); 
     programFrame.setSize(1280, 720); 
     programFrame.setLocationRelativeTo(null); 

而这里的ImagePanel我:

import java.awt.Graphics; 
import java.awt.Image; 

import javax.swing.JPanel; 

class ImagePanel extends JPanel { 
    private Image image; 
    private boolean tile; 

    ImagePanel(Image image) { 
     this.image = image; 
     this.tile = false; 
    }; 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int iw = image.getWidth(this); 
     int ih = image.getHeight(this); 
     if (iw > 0 && ih > 0) { 
      for (int x = 0; x < getWidth(); x += iw) { 
       for (int y = 0; y < getHeight(); y += ih) { 
        g.drawImage(image, x, y, iw, ih, this); 
       } 
      } 
     } 
    } 
} 

感谢(未来)帮帮我!

编辑:根据给出的答案作了一个小小的改变,但它仍然无法正常工作。 好的,所以问题是应该重复的图像实际上并没有显示出来。

EDIT2:重写了我的整个代码,并且它仍然不起作用。即使设置背景颜色也不起作用,这导致我相信这是我的paintComponent的一个问题。

编辑3:paintComponent正在工作,感谢帮助。我最后的问题是让它在我的主要方法中正常工作。

+3

“什么?我做错了”你还没有告诉我们你的程序出了什么问题。 – Raedwald

+0

问题是你没有看到任何东西?原因是你使用gbi而不是g2d,gbi是图像的图形对象。 – arynaq

+0

@Rededwald编辑的问题。 :) – Hathor

回答

1

First JFrame.setVisible(true);应该在最后完成,pack()之后进行布局。

framePanel.pack(); 

    framePanel.setVisible(true); 

的图像可能更好地驻留在应用程序(JAR)本身,那么你可以使用getClass().getResource("...")。 他们应该加载油漆,说在构造函数。我猜,这是测试代码。

public static Image whiteOverlayStreak; 
public static Image blackOverlayStreak; 

DiagonalImages() { 
    loadImages(); 
} 

private void loadImages() { 
    whiteOverlayStreak = new ImageIcon(
      getClass().getResource("/white.jpg")).getImage(); 
    blackOverlayStreak = new ImageIcon(
      getClass().getResource("/black.jpg")).getImage(); 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 

     int x = r.nextInt(w); 
     int y = r.nextInt(h); 

你的失败是没有使用@Override因为那时你会看到,你miswrote Graphics2D g,而不是Graphics g函数paintComponent永远不会被调用!大声笑


其他问题:将第二面板

framePanel.setLayout(new BorderLayout()); 
    framePanel.add(diagTest, BorderLayout.CENTER); 
    framePanel.add(otherPanel, BorderLayout.SOUTH); 
+0

哈哈,我不敢相信我犯了这样一个愚蠢的错误。下次我会更加小心。这些图像位于.jar文件旁边的文件夹中。最后,我必须将其添加到我编辑的另一个JPanel。但是,当我尝试这个时,我所看到的就是DiagonalImages面板。我该如何解决? (代码在我的示例中发布,我认为没有必要为此提出另一个问题。) – Hathor

+0

扩展了答案。我通常使用IDE来生成重写方法。即使它在打字过程中更具破坏性。 –

+0

我认为你误解了,我试图将DiagonalImages面板添加到其他类文件。我尝试添加另一个JPanel,然后按顺序在面板中添加,但似乎不起作用。 JLayeredPane会是最好的,因为我希望DiagonalImages直接在ImagePanel上。 – Hathor

0

这不是一个真正的SSCCE。

我还没有完全测试过,主要是因为我不想为了指出明显的错误而设置整个Eclipse项目。

  • 将图像处理从JPanel中分离出来。

  • 当您修改组件方法时,仅扩展Swing组件。

这是我的代码版本。我不得不修改你的代码来阅读一个图像来使它工作。你将不得不自己弄清楚那部分代码。

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Insets; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.Random; 

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

class GUIImages { 

    private Image whiteDiagonal; 

    // private Image blackDiagonal; 

    public GUIImages() { 
     loadImages(); 
    } 

    private void loadImages() { 
     try { 
      whiteDiagonal = ImageIO.read(new File(
        "C:/Documents and Settings/BOP00082/" + 
        "My Documents/My Pictures/Places-icon.png")); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     // whiteDiagonal = new ImageIcon(this.getClass().getResource(
     // "imageFolder/whiteBackgroundStreakOverlay.png")).getImage(); 
     // blackDiagonal = new ImageIcon(this.getClass().getResource(
     // "imageFolder/blackBackgroundStreakOverlay.png")).getImage(); 
    } 

    public void doDrawing(JPanel panel, Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.drawImage(createDiagonalImage(panel), 0, 0, null); 
    } 

    private Image createDiagonalImage(JPanel panel) { 
     BufferedImage buffImg = new BufferedImage(677, 856, 
       BufferedImage.TYPE_INT_ARGB); 

     Graphics2D gbi = buffImg.createGraphics(); 

     Dimension size = panel.getSize(); 
     Insets insets = panel.getInsets(); 

     int w = size.width - insets.left - insets.right; 
     int h = size.height - insets.top - insets.bottom; 

     Random r = new Random(); 

     for (int i = 0; i < 5; i++) { 

      int x = Math.abs(r.nextInt()) % w; 
      int y = Math.abs(r.nextInt()) % h; 

      gbi.drawImage(whiteDiagonal, x, y, null); 
     } 
     gbi.dispose(); 

     return buffImg; 
    } 
} 

class Surface extends JPanel { 

    GUIImages images; 

    public Surface(GUIImages images) { 
     this.images = images; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     images.doDrawing(this, g); 
    } 
} 

public class RepeatDiagonals implements Runnable { 

    JFrame frame; 

    @Override 
    public void run() { 
     frame = new JFrame(); 
     frame.setTitle("Repeat Diagonals"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.add(new Surface(new GUIImages())); 

     frame.setSize(350, 250); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new RepeatDiagonals()); 
    } 
} 
+0

嘿,刚刚编辑我原来的帖子一点。问题是图像甚至没有显示,我得到的只是JFrame,而且它是空的。 – Hathor

+0

@Hathor:查看我的更新回答。 –

+0

尝试了您的解决方案,但仍然无法正常工作,因此我重写了我的代码。它仍然没有工作,甚至没有将面板设置为黑色,所以我有一个预感,这是我的paintComponent的一个问题。 您是否看到我可以修复该问题的方法? 感谢所有帮助到目前为止。 – Hathor