2017-09-17 14 views
0

J'ai créé une page d'information sur les étudiants en utilisant le concept d'interface graphique. Je veux savoir comment puis-je ajouter une image à un emplacement spécifique en utilisant JLabel ou toute autre méthode? Ce que je veux, c'est une image de fond entourant l'ensemble de Jframe et une autre image à un endroit spécifique, comme en haut à droite. Comment puis-je atteindre cet objectif?Comment ajouter une image à un emplacement spécifique dans JFrame dans Java en utilisant eclipse?

J'ai également trouvé un code pour ajouter une image en utilisant Jlabel mais cela ne fonctionne pas avec mon code comme étant ma mise en page à null. le code i trouvé

String path = "Image1.jpg"; 
    File file = new File(path); 
    BufferedImage image = ImageIO.read(file); 
    JLabel label = new JLabel(new ImageIcon(image)); 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.getContentPane().add(label); 
    f.pack(); 
    f.setLocation(200,200); 
    f.setVisible(true); 

Ci-dessous mon code:

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.ButtonGroup; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JRadioButton; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class LoginPage 
{ 

JFrame jf; 
JLabel gender,hobbies,name_label,rollno_label,marks_label,city_label,address_label; 
JTextField name_field,rollno_field,marks_field; 
JRadioButton male,female; 
ButtonGroup bg; 
JCheckBox photography,music,sketching,coding; 
JComboBox city_combo; 
JTextArea adress_textarea; 
JButton save, exit; 
JMenuBar mbar; 
JMenu file,edit,help; 
JMenuItem open,save_item,edit_item,close,cut,copy,paste,find,replace,help_content,about,updates; 


    public LoginPage() //constructor 
    { 

    jf = new JFrame("Student Information"); 
    name_label = new JLabel("Student's Name"); 
    name_field = new JTextField(); 
    rollno_label = new JLabel("Student's Roll Number"); 
    rollno_field = new JTextField(); 
    marks_label = new JLabel("Student's Total Marks Achieved"); 
    marks_field = new JTextField(); 
    gender = new JLabel("Gender"); 
    male = new JRadioButton("Male"); 
    female = new JRadioButton("Female"); 
    bg = new ButtonGroup(); 
    hobbies = new JLabel("Hobbies"); 
    photography = new JCheckBox("Photography"); 
    music = new JCheckBox("Music"); 
    coding = new JCheckBox("Coding"); 
    sketching = new JCheckBox("Sketching"); 
    city_label = new JLabel("City"); 
    city_combo = new JComboBox(); 
    address_label = new JLabel("Residential Address"); 
    adress_textarea = new JTextArea(); 
    save = new JButton("Save"); 
    exit = new JButton("Exit"); 
    mbar = new JMenuBar(); 
    file = new JMenu("File"); 
    edit = new JMenu("Edit"); 
    help = new JMenu("Help"); 
    open = new JMenuItem("open"); 
    save_item = new JMenuItem("Save"); 
    edit_item = new JMenuItem("Edit"); 
    close = new JMenuItem("Close"); 
    cut = new JMenuItem("Cut"); 
    copy = new JMenuItem("Copy"); 
    paste = new JMenuItem("Paste"); 
    find = new JMenuItem("Find"); 
    replace = new JMenuItem("Replace"); 
    about = new JMenuItem("About"); 
    updates = new JMenuItem("Check for Updates"); 
    help_content = new JMenuItem("Help Content"); 

    } 

void Display() 
{ 
    jf.setSize(1000, 700); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jf.setLayout(null); 
    jf.getContentPane().setBackground(Color.LIGHT_GRAY); 

    name_label.setBounds(50, 50, 150, 20); 
    name_field.setBounds(300, 50, 200, 20); 
    rollno_label.setBounds(50, 100, 150, 20); 
    rollno_field.setBounds(300, 100, 200, 20); 
    marks_label.setBounds(50, 150, 200, 20); 
    marks_field.setBounds(300, 150, 200, 20); 
    gender.setBounds(50, 200, 100, 20); 
    male.setBounds(300, 200, 80, 20); 
    female.setBounds(400, 200, 80, 20); 
    hobbies.setBounds(50, 250, 80, 20); 
    photography.setBounds(300, 250, 100, 20); 
    music.setBounds(420, 250, 80, 20); 
    sketching.setBounds(500, 250, 100, 20); 
    coding.setBounds(600, 250, 80, 20); 
    city_label.setBounds(50, 300, 100, 20); 
    city_combo.setBounds(300, 300, 100, 20); 
    address_label.setBounds(50, 350, 200, 20); 
    adress_textarea.setBounds(300, 350, 300, 100); 
    save.setBounds(300, 500, 100, 50); 
    exit.setBounds(600, 500, 100, 50); 

    bg.add(male); 
    bg.add(female); 

    city_combo.addItem("Select City"); 
    city_combo.addItem("Chandigarh"); 
    city_combo.addItem("Kurali"); 
    city_combo.addItem("Mohali"); 
    city_combo.addItem("Panchkula"); 

    file.add(open); 
    file.add(save_item); 
    file.add(edit_item); 
    file.add(close); 
    edit.add(cut); 
    edit.add(copy); 
    edit.add(paste); 
    edit.add(find); 
    edit.add(replace); 
    help.add(about); 
    help.add(help_content); 
    help.add(updates); 
    mbar.add(file); 
    mbar.add(edit); 
    mbar.add(help); 

    jf.add(name_label); 
    jf.add(name_field); 
    jf.add(rollno_label); 
    jf.add(rollno_field); 
    jf.add(marks_label); 
    jf.add(marks_field); 
    jf.add(gender); 
    jf.add(male); 
    jf.add(female); 
    jf.add(hobbies); 
    jf.add(music); 
    jf.add(photography); 
    jf.add(sketching); 
    jf.add(coding); 
    jf.add(city_label); 
    jf.add(city_combo); 
    jf.add(address_label); 
    jf.add(adress_textarea); 
    jf.add(save); 
    jf.add(exit); 

    jf.setJMenuBar(mbar); 

    jf.setVisible(true); 


} 

public static void main(String[] args) { 
    new LoginPage().Display(); 
} 

} 

Répondre

1

Ce que je veux est une image de fond entourant l'ensemble Jframe

Suggestions:

  • Créer une classe qui s'étend JPanel,
  • override sa méthode paintComponent
  • assurez-vous d'appeler la méthode paintComponent de super dans votre override
  • Dessiner votre image d'arrière-plan au sein de cette méthode en utilisant g.drawImage(...)
  • Ou faites ce JPanel contentPane de votre JFrame ou l'ajouter à la ContentPane BorderLayout.CENTER, puis ajoutez vos composants GUI à cette JPanel
  • Assurez-vous que certains des composants ne sont pas opaques, par exemple, appelez setOpaque(false) sur vos JRadioButtons, et peut-être d'autres, de sorte que l'image de fond se présente .

et une autre image à un emplacement spécifique comme en haut à droite. Comment puis-je atteindre cet objectif?

  • Utilisez au-dessus des mêmes JPanel, et d'en tirer la plus petite image avec une surcharge de drawImage(...) qui place précisément l'image où vous voulez

Notes:

  • Lorsque je crée arrière-plan images pour l'interface graphique, je préfère dessiner dans un JPanel plutôt qu'un JLabel puisque le JLabel n'est pas câblé hors de la boîte pour agir comme un contentPane ou un conteneur décent.
  • Je fortement vous conseillons de ne pas utiliser null mises en page et setBounds que cela conduira à interfaces graphiques qui pourraient bien paraître sur une plate-forme, mais pas sur une autre, qui ont JLabels dont le texte ne se voit pas complètement, qui sont très difficiles à mettre à jour et maintenir. Apprenez et utilisez les gestionnaires de disposition.
  • Il semblerait que vous utilisiez plusieurs JFrames.Si oui, s'il vous plaît lire: The Use of Multiple JFrames: Good or Bad Practice?

Par exemple, voici une façon d'afficher une image comme une image d'arrière-plan ainsi qu'une image plus petite dans la partie supérieure droite de l'interface graphique, le tout dans un JPanel:

import java.awt.Dimension; 
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 LoginPage3 extends JPanel { 
    public static final String BG_IMG_PATH = "https://upload.wikimedia.org/wikipedia/" 
      + "commons/e/e9/Maesil_%28prunus_mume%29_washed_and_stemmed.jpg"; 
    public static final String RU_IMG_PATH = "https://upload.wikimedia.org/wikipedia/" 
      + "commons/thumb/5/5b/Escudo_de_San_Pedro_de_Atacama.svg/200px-Escudo_de_San_Pedro_de_Atacama.svg.png"; 

    private BufferedImage backgroundImg; 
    private BufferedImage rightUpperImg; 

    public LoginPage3(BufferedImage bgImg, BufferedImage ruImg) { 
     this.backgroundImg = bgImg; 
     this.rightUpperImg = ruImg; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (backgroundImg == null || isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } else { 
      int w = backgroundImg.getWidth(); 
      int h = backgroundImg.getHeight(); 
      return new Dimension(w, h); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (backgroundImg != null) { 
      g.drawImage(backgroundImg, 0, 0, this); 
     } 
     if (rightUpperImg != null) { 
      int x = getWidth() - rightUpperImg.getWidth(); 
      g.drawImage(rightUpperImg, x, 0, this); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     BufferedImage bg = null; 
     BufferedImage ru = null; 
     try { 
      bg = ImageIO.read(new URL(BG_IMG_PATH)); 
      ru = ImageIO.read(new URL(RU_IMG_PATH)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 

     LoginPage3 mainPanel = new LoginPage3(bg, ru); 
     JFrame frame = new JFrame("LoginPage3"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

Pas besoin de faire ces ... –

+0

Aussi ne peut pas ajouter comme 'BorderLayout.CENTER' si la disposition est' null' ... –

+0

@UsagiMiyamoto: oui, et comme je l'ai noté ci-dessus (et en tant que répondeur sur ce site, vous devriez également recommander), il ne devrait pas ** utiliser ** mises en page «null». Puisque nous dirigeons les débutants Swing, nous devrions recommander les meilleures pratiques, pas les kludges. –

1

Pour une image de fond:

  • charge comme un icon, et créer un JLabel avec elle. (Voir votre premier extrait)
  • Définissez JLabel comme volet de contenu de JFrame.

Tout ce que vous devez prendre en charge, que Icon ne s'étire pas, alors vous devez avoir une image qui est exactement la même taille que votre JFrame (ou plus).

En ce qui concerne l'image à une position donnée, la JLabel crée et Icon processus de chargement est le même, mais après l'avoir ajouté à la JFrame, vous devez définir la position et la taille, tout comme pour vos autres composants, appel EG setBounds().