问题
Why My JComponent is not displayed on top of backgound JFrame?
Please check the following code:
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);
}
}
回答1:
Seems to work fine here (in this SSCCE variant of the code).

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);
}
}
The only conclusion I can draw from this is that:
- Your resource is not being found.
- You need to learn basic debugging skills. In this case, specificailly 'checking the presumptions that what is happening in each step is actually working'. 'Triple level' statements such as the following should be broken down to 3 statements, with you checking each of the 3 results using
System.out.println()
or a debugger.
Debug unfriendly!
new JLabel(new ImageIcon(getClass()
.getResource("background/2.jpg")));
And a note for future. For better help sooner, post an SSCCE.
回答2:
Try to use contentPane.add(myComponent);
rather than add(myComponent);
来源:https://stackoverflow.com/questions/10135627/why-my-jcomponent-is-not-displayed-on-top-of-backgound-jframe