2013-02-08 68 views
-1

當我運行我的程序時,一切都按照計劃進行,除非按鈕我必須更改屏幕上的卡片纔會出現,直到它被淹沒。我假設這是因爲無論容納圖像的容器都結束了它,但我不知道如何將它移動到背景中,甚至可以使用什麼樣的容器來添加圖像。JButton不會出現,直到被淹沒

import java.io.*; 
import java.awt.*; 
import javax.swing.*; 
import java.util.Random; 
import java.awt.event.*; 
import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 

public class oneplayer extends JFrame { 
    BufferedImage image1, image2, image3, image4; 
    Random gen = new Random(); 
    public void redo() { 
     int p1, p2, p3, p4; 
     p1 = gen.nextInt(13) + 1; 
     p2 = gen.nextInt(13) + 14; 
     p3 = gen.nextInt(13) + 27; 
     p4 = gen.nextInt(13) + 40; 
     try { 
     File input1 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p1 + ".png"); 
     File input2 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p2 + ".png"); 
     File input3 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p3 + ".png"); 
     File input4 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p4 + ".png"); 
     image1 = ImageIO.read(input1); 
     image2 = ImageIO.read(input2); 
     image3 = ImageIO.read(input3); 
     image4 = ImageIO.read(input4); 
    } catch (IOException ie) { 
     System.out.println("Error:"+ie.getMessage()); 
    } 
    repaint(); 
} 

public oneplayer() { 
    JPanel buttonPanel = new JPanel(); 
    setLayout(new BorderLayout()); 
    JButton refresh = new JButton("Refresh"); 
    refresh.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      redo(); 
     } 
    }); 
    add(buttonPanel, BorderLayout.SOUTH); 
    buttonPanel.add(refresh, BorderLayout.CENTER); 
    redo(); 
} 

public void paint(Graphics g) { 
    g.drawImage(image1, 20, 55, null); 
    g.drawImage(image2, 96, 55, null); 
    g.drawImage(image3, 172, 55, null); 
    g.drawImage(image4, 248, 55, null); 
} 

public static void main(String args[]) { 
    oneplayer frame = new oneplayer(); 
    frame.setTitle("Random Cards"); 
    frame.setSize(350, 200); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 
} 

回答

0

你需要打電話給你的super.paint(g)功能paint(Graphics)內,以確保框架中的Swing組件正常顯示。

+1

雖然在技術上是正確的,但最好是使用其paintComponent方法替代JPanel之類的子容器執行自定義繪畫。 – MadProgrammer 2013-02-08 14:23:28

+0

這種方法工作起來並且需要較少的編碼。謝謝 – user2054538 2013-02-08 17:19:30

0

尚未對您的示例進行測試,但我認爲您需要在重寫Frame上的繪畫時調用父類的繪畫,以便Frame的組件顯示出來。像這樣:

public void paint(Graphics g) { 
    super.paint(g); 
    g.drawImage(image1, 20, 55, null); 
    g.drawImage(image2, 96, 55, null); 
    g.drawImage(image3, 172, 55, null); 
    g.drawImage(image4, 248, 55, null); 
} 
+0

雖然在技術上是正確的,但最好是使用paintComponent方法在JPanel之類的子容器上執行自定義繪畫,而不是使用 – MadProgrammer 2013-02-08 14:23:53

+0

這個工作很好ty – user2054538 2013-02-08 17:20:16

4

請勿重寫paint()方法。而是覆蓋主容器的paintComponent()

呼叫super.paintComponent(g)

不要延長JFrame,但如JPanel,將所有內容添加到面板並將該面板設置爲通常的JFrame實例的內容窗格。

+0

工作正常。非常感激。 – user2054538 2013-02-08 14:35:55

+2

@ user2054538:您可以點擊[空勾號](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)來接受此答案。左邊。 – trashgod 2013-02-08 15:18:10