この質問は以前に行われたことがあると確信していますが、私の場合は少し異なります。背景として機能するJLabelの上にJLabelを配置しようとしているため、JLabelを使用して変化する数字を表示したいのですが、必要な数字は背景の上に表示するために、しかし私は少しスイングn00bです、事前に感謝します、ジョナサン
16696 次
3 に答える
10
要件を十分に理解していなくても、単に背景画像の上にテキストを表示する必要がある場合は、背景をペイントできるカスタム パネルの上にラベルを配置することをお勧めします。
混乱することなく、レイアウト マネージャーの利点を得ることができます。
まず、 Performing Custom Painting and Graphics2D Trailを読んでください。
それが難しいと思われる場合、JLabel
実際には のタイプですContainer
。つまり、実際には他のコンポーネントを「含む」ことができます。
例
背景ペイン...
public class PaintPane extends JPanel {
private Image background;
public PaintPane(Image image) {
// This is just an example, I'd prefer to use setters/getters
// and would also need to provide alignment options ;)
background = image;
}
@Override
public Dimension getPreferredSize() {
return background == null ? new Dimension(0, 0) : new Dimension(background.getWidth(this), background.getHeight(this));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (background != null) {
Insets insets = getInsets();
int width = getWidth() - 1 - (insets.left + insets.right);
int height = getHeight() - 1 - (insets.top + insets.bottom);
int x = (width - background.getWidth(this)) / 2;
int y = (height - background.getHeight(this)) / 2;
g.drawImage(background, x, y, this);
}
}
}
で構築された...
public TestLayoutOverlay() throws IOException { // Extends JFrame...
setTitle("test");
setLayout(new GridBagLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
PaintPane pane = new PaintPane(ImageIO.read(new File("fire.jpg")));
pane.setLayout(new BorderLayout());
add(pane);
JLabel label = new JLabel("I'm on fire");
label.setFont(label.getFont().deriveFont(Font.BOLD, 48));
label.setForeground(Color.WHITE);
label.setHorizontalAlignment(JLabel.CENTER);
pane.add(label);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
そして、私が偏見ではないことを示すために;)、ラベルを使用した例...
public TestLayoutOverlay() {
setTitle("test");
setLayout(new GridBagLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
JLabel background = new JLabel(new ImageIcon("fire.jpg"));
background.setLayout(new BorderLayout());
add(background);
JLabel label = new JLabel("I'm on fire");
label.setFont(label.getFont().deriveFont(Font.BOLD, 48));
label.setForeground(Color.WHITE);
label.setHorizontalAlignment(JLabel.CENTER);
background.add(label);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
于 2012-09-03T21:12:43.637 に答える
0
実行時:
- 親からラベルを削除する
- レイヤーをサポートするコンテナーを追加します
- 2x レイヤーを追加しますが、Z オーダーは維持します
楽しみ。(コピー&ペースト用の完全なコードはありません)
于 2012-09-03T21:13:16.160 に答える
-3
あなたはこれによってそれをすることができます:
JLabel l1=new JLabel();
JLabel l2=new JLabel();
l1.add(l2, JLabel.NORTH);
于 2012-09-03T21:35:51.163 に答える