1

私はJava Swingの開発に非常に慣れていないため、次の問題があります。

背景画像を持つ JFrame ウィンドウを作成する必要があります。

そのため、次の操作を実行しました。

1) JPanelを拡張するJPanelWithBackgroundという名前のクラスを作成しました。

package com.test.login;

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class JPanelWithBackground extends JPanel {

    private Image backgroundImage;

    // Some code to initialize the background image.
    // Here, we use the constructor to load the image. This
    // can vary depending on the use case of the panel.
    public JPanelWithBackground(String fileName) throws IOException {
        backgroundImage = ImageIO.read(new File(fileName));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Draw the background image.
        // g.drawImage(backgroundImage, 0, 0, this);
        g.drawImage(backgroundImage, 0, 0, 550, 230, this);
    }
}

ご覧のとおり、このクラスは画像ファイルを読み取り、その参照をbackgroundImageという名前の Image オブジェクトに入れ、それをGraphicsオブジェクトに描画します。

2) 次に、LoginFrame2という名前のクラスを作成しました。

package com.test.login;

import javax.swing.JButton;

import java.awt.Container;
import java.awt.Dimension;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu.Separator;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

import net.miginfocom.swt.MigLayout;

import org.jdesktop.application.SingleFrameApplication;

public class LoginFrame2 extends SingleFrameApplication {

    private static final int FIXED_WIDTH = 550;
    private static final Dimension INITAL_SIZE = new Dimension(FIXED_WIDTH, 230);

    public static void main(String[] args) {
        System.out.println("DENTRO: LoginFrame() ---> main()");
        launch(LoginFrame2.class, args);
    }

    @Override
    protected void startup() {
        // TODO Auto-generated method stub
        System.out.println("Inside startup()");


        JFrame mainFrame = this.getMainFrame();         // main JFrame that represents the Windows
        mainFrame.setTitle("Chilli Login");

        mainFrame.setPreferredSize(INITAL_SIZE);
        mainFrame.setResizable(false);

        Container mainContainer = mainFrame.getContentPane();       // main Container into the main JFrame


        // JPanel creation and settings of the MigLayout on it:
        // JPanel externalPanel = new JPanel();
        JPanelWithBackground externalPanel = null;

        try {
            externalPanel = new JPanelWithBackground("/home/andrea/Immagini/logo2.jpg");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        externalPanel.setLayout(new net.miginfocom.swing.MigLayout("fill"));

        externalPanel.add(new JLabel("Username"), "w 50%, wrap");

        JTextField userNameTextField = new JTextField(20);

        externalPanel.add(userNameTextField, "w 90%, wrap");

        externalPanel.add(new JLabel("Password"), "w 50%, wrap");
        JTextField pswdTextField = new JTextField(20);
        externalPanel.add(pswdTextField, "w 90%, wrap");

        JButton loginButton = new JButton("Login");

        externalPanel.add(loginButton, "w 25%, wrap");

        mainContainer.add(externalPanel);
        //mainFrame.add(mainContainer);

        show(mainFrame);


    }

}

このクラスは、 JFrameインスタンスを提供するJDesktop Swin フレームワークのSingleFrameApplication抽象クラスを拡張します。

このクラスは、次の行でJPanelWithBackgroundオブジェクトを作成するだけです。

externalPanel = new JPanelWithBackground("/home/andrea/Immagini/logo2.jpg");

このオブジェクトにいくつかの Swing コンポーネントを入れます。

これは私の結果です:

ここに画像の説明を入力

私の疑問/問題は次のとおりです。文字列パスワードを示すJLabelを見ることができるように、(私のチリのロゴの) 画像の赤い部分にあり、あまり読みにくいです。

読みやすくするにはどうすればよいですか?たとえば、JLabelの背景を白にする必要があるように設定できますか?

TNX

アンドレア

4

2 に答える 2

1

背景画像の不透明度を変更できます...

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g.create();

    // Draw the background image.
    // g.drawImage(backgroundImage, 0, 0, this);
    g2d.setComposite(AlphaComposite.SrcOvr.derive(0.5f));
    g2d.drawImage(backgroundImage, 0, 0, 550, 230, this);
    g2d.dispose();
}
于 2013-11-08T19:55:52.393 に答える