5

作ったプログラムの背景が地味にならないように友達に作ってもらったのですが、画像の配置はJLabelを作って画像で塗りつぶし、画面のサイズ。JFrameの周りに小さな境界線があり、JLabelをフレームの端に接触させることができないことを除いて、これはうまくいきました。考え?写真を添付し​​ました。

国境問題

public class ProgramDriver extends JFrame {

private JPanel contentPane;
private static CardLayout cardLayout;
private JTextField addGradeN;
private JTextField addGradeD;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ProgramDriver frame = new ProgramDriver();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

//Global Variables 
...
    manager = new StateManager(gb);

    //JFrame Settings
    setTitle("Grade Book");
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setBounds(100, 100, 656, 530);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    cardLayout = new CardLayout(0,0);
    contentPane.setLayout(cardLayout);
    setResizable(false);

    //Home Panel 
    final JPanel Home = new JPanel();
    contentPane.add(Home, "Home");
    Home.setLayout(null);

    JButton btnSeeGrades = new JButton("See Grades");
    ...

    //Grades Panel
    JPanel Grades = new JPanel();
    contentPane.add(Grades, "Grades");
    Grades.setLayout(null);'
4

5 に答える 5

4

問題は ではなくJFrame、コードにあります。残りの自然な生活を何が悪いのかを推測することに費やすか、サンプル コードを投稿することができます。

それはあなた次第です。私たちはあなたに間違った推測の後に間違った推測を投げつけようとし続け、私たち全員を苛立たせることができます.

これが私が行った2つの例です。1 つ目は、JLabelを のプライマリ コンテンツとして使用しJPanel、そこに子コンポーネントを配置します。素敵でシンプル。

JPanel2 つ目は、コンポーネントの背景に画像を描画するカスタムを使用します。次に、これを使用してフレーム コンテンツ ペインを置き換えます。これはもう少し複雑ですが、簡単に更新できるという追加の利点があります (コンテンツ ペインを置き換えても、プログラムの残りの部分には影響しません)。

例 1:JLabel背景として使用

背景としての JLabel

public class TestBackground {

    public static final String BACKGROUND_PATH = "/Volumes/Macintosh HD2/Dropbox/MT015.jpg";

    public static void main(String[] args) {
        new TestBackground();
    }

    public TestBackground() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setLayout(new BorderLayout());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new LabelPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });

    }

    protected class LabelPane extends JPanel {

        public LabelPane() {

            BufferedImage bg = null;
            try {
                bg = ImageIO.read(new File(BACKGROUND_PATH));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            JLabel label = new JLabel(new ImageIcon(bg));
            setLayout(new BorderLayout());

            add(label);

            label.setLayout(new GridBagLayout());

            JLabel lblMessage = new JLabel("Look at me!");
            lblMessage.setForeground(Color.WHITE);
            lblMessage.setFont(lblMessage.getFont().deriveFont(Font.BOLD, 48));

            label.add(lblMessage);

        }
    }
}

例 2: 画像を背景として使用し、コンテンツ ペインを置き換えます...

バックグラウンド コンテンツ ペイン

public class TestBackground {
    public static final String BACKGROUND_PATH = "/Volumes/Macintosh HD2/Dropbox/MT015.jpg";

    public static void main(String[] args) {
        new TestBackground();
    }

    public TestBackground() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setLayout(new BorderLayout());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new BackgroundPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class BackgroundPane extends JPanel {

        private BufferedImage bg = null;

        public BackgroundPane() {
            try {
                bg = ImageIO.read(new File(BACKGROUND_PATH));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            setLayout(new GridBagLayout());

            JLabel lblMessage = new JLabel("Look at me!");
            lblMessage.setForeground(Color.WHITE);
            lblMessage.setFont(lblMessage.getFont().deriveFont(Font.BOLD, 48));

            add(lblMessage);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(1153, 823);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (bg != null) {
                g.drawImage(bg, 0, 0, this);
            }
        }
    }
}
于 2012-10-06T20:36:52.720 に答える
3

Eng.Fouad の回答を拡張するには、drawImage(...)6 つのパラメーター、画像、x と y の位置、画像の幅と高さ、および画像オブザーバーを受け取るメソッドを使用し、JPanel 内からそのように描画する必要があります。

g.drawImage(img, 0, 0, getWidth(), getHeight(), this);

たとえば、私のsscce :

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class ExpandingImage extends JPanel {
   public static final String GUITAR = "http://duke.kenai.com/Oracle/OracleStrat.png";
   BufferedImage img;

   public ExpandingImage(String imgUrlPath) throws IOException {
      URL imgUrl = new URL(imgUrlPath);
      img = ImageIO.read(imgUrl);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (img != null) {
         g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
      }
   }


   private static void createAndShowGui() {
      ExpandingImage mainPanel;
      try {
         mainPanel = new ExpandingImage(GUITAR);
         JFrame frame = new JFrame("ExpandingImage");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.getContentPane().add(mainPanel);
         frame.pack();
         frame.setLocationByPlatform(true);
         frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
         frame.setVisible(true);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

編集
contentPane の周りに EmptyBorder を使用しているようです。この境界線を存在させたくないのはなぜですか?

于 2012-10-06T19:38:18.137 に答える
2

paintComponent(Graphics g)別の方法として、JPanel (contentPane)のメソッドをオーバーライドして、この例drawImage()のようにGraphicsオブジェクトで使用することもできます。g

于 2012-10-06T19:06:45.587 に答える
1

JFrame 関数 setUndecorated() を試しましたか?

于 2012-10-06T19:07:15.820 に答える
0

フレームを装飾なしにします。frame.setUndecorated(true)

動かしたい場合ComponentMoverは、Java2S の を使用できます。

表示される前に装飾されていないことを確認してください。

次に、使用しますsetContentPane(new JLabel(new ImageIcon("myimage.jpg")));

その後、通常どおりコンテンツを追加できます。

于 2012-10-06T20:55:54.243 に答える