2

テキストを上部に、ボタンを中央のレイアウトに表示しようとしています。しかし、出力は少し奇妙です。たくさんのボタンを表示します。このコードの何が問題になっていますか?

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.LayoutManager;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ImagePaneTest {

    public static void main(String a[]) {
        TransparentPanel transparentPanel = new TransparentPanel(
                new BorderLayout());

        JPanel p = new JPanel();
        JLabel la = new JLabel("Title");
        p.add(la);
        p.setOpaque(false);

        JPanel p1 = new JPanel();
        JButton la1 = new JButton("Button");
        p1.add(la1);
        p1.setOpaque(false);

        JFrame fr = new JFrame();

        fr.getContentPane().add(transparentPanel);
        transparentPanel.add(p, BorderLayout.NORTH);
        transparentPanel.add(p1, BorderLayout.CENTER);

        fr.setSize(500, 500);
        fr.setVisible(true);
    }

}

class TransparentPanel extends JPanel {

    public TransparentPanel(LayoutManager l) {
        super.setLayout(l);
    }

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

        Image image = Toolkit.getDefaultToolkit().getImage(
                ImagePaneTest.class.getResource("/images/startback.jpg"));

        g.drawImage(image, 0, 0, null);
    }
}
4

2 に答える 2

2

そのはずsuper.paintComponent(g);

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

            Image image = Toolkit.getDefaultToolkit().getImage(
                    ImagePaneTest.class.getResource("/images/startback.jpg"));

            g.drawImage(image, 0, 0, null);
        }
于 2013-10-26T13:19:54.597 に答える
1

super.paintComponent(g);の代わりにカスタム ペイント コードに使用しpaintComponentsます。paintComponents必要なときに呼び出される API に任されています。

http://www.oracle.com/technetwork/java/painting-140037.htmlから:

Swing プログラムは、paint() をオーバーライドするのではなく、paintComponent() をオーバーライドする必要があります。API では許可されていますが、通常、paintBorder() または paintComponents() をオーバーライドする理由はありません (オーバーライドする場合は、自分が何をしているのかを確認してください!)。

編集:あなたがオーバーライドしているのを見たpaintComponentので、スーパーコールもする必要がありpaintComponentます

于 2013-10-26T13:24:07.887 に答える