2013-02-08 5 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) функцию, чтобы гарантировать, что компоненты Свинг внутри кадра отображается правильно.

+1

В то время как технически правильно, предпочтительно, чтобы пользовательская покраска выполнялась на дочернем контейнере, таком как JPanel, используя вместо этого свой метод paintComponent. – MadProgrammer

+0

Это работало и требовало меньше кодирования. спасибо – user2054538

0

Не тестировал это с помощью своего образца, но я думаю, вам нужно вызвать краску родительского класса, когда переопределяете краску на вашем кадре, чтобы компоненты компонента отображались. Например:

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

Хотя технически правильно, желательно, чтобы пользовательская покраска выполнялась на дочернем контейнере, например JPanel, используя вместо этого метод paintComponent. – MadProgrammer

+0

yup Это работало отлично. – user2054538

4

Не переопределяйте метод paint(). Вместо этого переопределите paintComponent() основного контейнера.

Вызов super.paintComponent(g)

Не выдвигайте JFrame, но, например, JPanel, добавьте все содержимое на панель и установите панель как область содержимого обычного экземпляра JFrame.

+0

Это сработало. Очень признателен. – user2054538

+2

@ user2054538: Вы можете принять этот ответ, щелкнув по [пустой галочке] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) в левый. – trashgod

Смежные вопросы