Почему мой JComponent не отображается поверх фона JFrame?

Почему мой JComponent не отображается поверх фона JFrame?

Пожалуйста, проверьте следующий код:

class CounterFrame extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private MyPanel myComponent = new MyPanel();
    private JLabel contentPane = new JLabel(new ImageIcon(getClass()
            .getResource("background/2.jpg")));

    CounterFrame() {
        contentPane.setLayout(new GridBagLayout());
        setContentPane(contentPane);
        add(myComponent);
    }

    }

    class MyPanel extends JPanel {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Font myFont;
    private String target;
    private String raised = "200000";
    private Image background;

    public MyPanel() {

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D twoD = (Graphics2D) g;

        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        rh.put(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        twoD.setRenderingHints(rh);

        File f = new File("fonts/event.ttf");
        try {
            myFont = Font.createFont(Font.TRUETYPE_FONT, f);
            myFont = myFont.deriveFont(90f);
        } catch (FontFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        twoD.setColor(Color.BLACK);
        twoD.setFont(myFont);

        twoD.drawString(raised,5, 90);
    }

}

person skystar7    schedule 13.04.2012    source источник
comment
Почему именно вы хотите добавить JPanel к «JLabel», а не наоборот?   -  person nIcE cOw    schedule 13.04.2012
comment
1) Чтобы быстрее получить помощь, опубликуйте SSCCE. 2) File f = new File("fonts/event.ttf"); а) Не загружайте ресурсы в методы рисования! б) Если это встроенный ресурс приложения, доступ к нему должен осуществляться по URL-адресу.   -  person Andrew Thompson    schedule 13.04.2012
comment
@nIcEcOw У меня есть короткий источник, который может продемонстрировать одно (тривиальное) его использование. Задайте вопрос и сообщите мне, и я добавлю его как ответ. :)   -  person Andrew Thompson    schedule 13.04.2012
comment
@AndrewThompson: Ага, только что сделал это, жду полезных мыслей по этому поводу :-)   -  person nIcE cOw    schedule 13.04.2012


Ответы (2)


Кажется, здесь все работает нормально (в этом варианте кода SSCCE).

Рабочий код

import java.awt.*;
import javax.swing.*;
import java.net.URL;

class CounterFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private MyPanel myComponent = new MyPanel();
    private JLabel contentPane;

    CounterFrame() {
        try {
            URL url = new URL("http://pscode.org/media/stromlo2.jpg");
            contentPane = new JLabel(new ImageIcon(url));
        } catch(Throwable t) {
            t.printStackTrace();
        }
        contentPane.setLayout(new GridBagLayout());
        setContentPane(contentPane);
        add(myComponent);
    }

    public static void main(String[] args) {
        //Create the frame on the event dispatching thread
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run() {
                CounterFrame rc = new CounterFrame();
                rc.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                rc.pack();
                rc.setVisible(true);
            }

        });
    }
    }

    class MyPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private String target;
    private String raised = "200000";
    private Image background;

    public MyPanel() {
        setPreferredSize(new Dimension(200,100));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D twoD = (Graphics2D) g;

        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        rh.put(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        twoD.setRenderingHints(rh);

        twoD.setColor(Color.BLACK);

        twoD.drawString(raised,5, 90);
    }
}

Единственный вывод, который я могу сделать из этого, заключается в следующем:

  1. Ваш ресурс не найден.
  2. Вам необходимо освоить базовые навыки отладки. В этом случае, в частности, «проверка предположений о том, что то, что происходит на каждом этапе, действительно работает». Утверждения «трехуровневого уровня», такие как следующие, должны быть разбиты на 3 утверждения, при этом вы проверяете каждый из 3 результатов с помощью System.out.println() или отладчика.

Отладка недружественная!

new JLabel(new ImageIcon(getClass()
        .getResource("background/2.jpg")));

И заметка на будущее. Чтобы быстрее получить помощь, опубликуйте SSCCE.

person Andrew Thompson    schedule 13.04.2012
comment
Я получил тот же результат, что и маленький белый квадрат, но почему он не рисует строку? - person skystar7; 13.04.2012

Попробуйте использовать contentPane.add(myComponent);, а не add(myComponent);

person StanislavL    schedule 13.04.2012
comment
@клеопатра. Вы неправы. в его коде contentPane = new JLabel(new ImageIcon(getClass() .getResource(background/2.jpg))); - person StanislavL; 13.04.2012
comment
Какая странная установка, которую я пропустил :-). Тем не менее, эти два метода добавляются к одному и тому же компоненту, который является этой меткой после установки его как contentPane. Или что еще мне не хватает? - person kleopatra; 13.04.2012