簡體   English   中英

JFrame在帶有圖片的標簽中繪制文本

[英]JFrame Draw text in a label with a picture

我試圖在帶有圖片和一些按鈕的標簽上顯示文本,但我注意到圖像和文本都設置在同一位置,這導致文本被圖片覆蓋。

我嘗試尋找分別顯示和設置范圍的方法,但找不到任何方法,如果添加另一個JLabel,它將打開一個新窗口,我需要使用同一窗口

public void carga_img(String name,int cols,int rengs){
ventana.setVisible(false);
//----          
        //Defino tamaño de la ventana que mantiene la imagen y los botones
        //ventana.setSize(519,391);
        ventana.setSize(415,400);
        imagen=null;
        //Inicializo la imagen que se va a cargar
        imagen = t.getImage (name);
        icono.setImage(imagen);

        //Creo la etiqueta con la imagen
        etiqueta.setIcon(icono);
        //Defino posición de inicio y el tamano de la etiqueta, ancho y alto
        etiqueta.setBounds(0, 0,cols,rengs);

        prev.setBounds(0, 400-88-50, 100,50);
        ini.setBounds(100, 400-88-50, 100,50);
        fin.setBounds(200, 400-88-50, 100,50);
        sigte.setBounds(300, 400-88-50, 100,50);
        Nombre.setBounds(0, 400-88, 100,50);
        Apellido.setBounds(100, 400-88, 100,50);
        Busca.setBounds(200, 400-88, 100,50);
        Fin.setBounds(300, 400-88, 100,50);
//-------           
        //Indico yo administrare como se insertan los componentes en la ventana (null)
        ventana.getContentPane().setLayout(null);
        //Agrego mi etiqueta y los botones
        ventana.getContentPane().add(etiqueta);
        ventana.getContentPane().add(sigte);
        ventana.getContentPane().add(prev);
        ventana.getContentPane().add(ini);
        ventana.getContentPane().add(fin);
        ventana.getContentPane().add(Nombre);
        ventana.getContentPane().add(Apellido);
        ventana.getContentPane().add(Busca);
        ventana.getContentPane().add(Fin);
        //Muestro la ventana
        ventana.setVisible(true);
    }

(這是針對學校中的一個項目的,因此應該不太重視在其他平台上運行)

這就是我得到的

在此處輸入圖片說明

http://i.stack.imgur.com/kmWW4.jpg

這就是我想做的

在此處輸入圖片說明

http://i.stack.imgur.com/Fnltt.jpg

您的問題似乎主要是您不使用布局管理器而是依賴於null布局和setBounds(...) 同樣,這會導致一些非常脆弱的GUI,很難對其進行增強,調試或更改。 相反,為什么不讓布局經理為您做繁重的工作呢?

  • 如果這是我的GUI,我將使整個GUI(JFrame的contentPane)使用BorderLayout,事實上,它在默認情況下已經執行了。 我將頂部的圖像和文本放入一個JPanel中,並將該JPanel放入contentPane BorderLayout.NORTH中。
  • 我將使頂部的JPanel使用BoxLayout,然后添加顯示圖像的JLabel,然后添加另一個將JLabel保存在GridLayout(0,1)(1列,行數可變)中的JPanel。
  • 我將JButtons放入使用GridLayout(2,4)的JPanel中,然后將此按鈕JPanel放入主要的BorderLayout.SOUTH中。

例如:

在此處輸入圖片說明


例如:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

public class SimpleGui extends JPanel {
   public static final String DUKE_IMG_PATH = "https://duke.kenai.com/guitar/."
         + "Thumbnails/DukeAsKeith-daylight.png.png";

   public SimpleGui() throws IOException {
      URL imgUrl = new URL(DUKE_IMG_PATH);
      BufferedImage image = ImageIO.read(imgUrl);
      ImageIcon icon = new ImageIcon(image);
      JLabel label = new JLabel(icon);

      JPanel labelsPanel = new JPanel(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = 0;
      gbc.gridy = 0;
      gbc.weightx = 1.0;
      gbc.anchor = GridBagConstraints.WEST;
      labelsPanel.add(new JLabel("Number: XXXXXXX", SwingConstants.LEADING),
            gbc);
      gbc.gridy++;
      labelsPanel.add(
            new JLabel("First Name: XXXXXXX", SwingConstants.LEADING), gbc);
      gbc.gridy++;
      labelsPanel.add(new JLabel("Last Name: XXXXXXX", SwingConstants.LEADING),
            gbc);

      JPanel topPanel = new JPanel();
      topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.LINE_AXIS));
      topPanel.add(label);
      topPanel.add(labelsPanel);
      topPanel.add(Box.createGlue());

      JPanel bottomPanel = new JPanel(new GridLayout(2, 4));
      String[] btnLabels = { "Previo", "Inicio", "Ultimo", "Sigiente",
            "Nombre", "Apellido", "Busca", "Fin" };
      for (String btnLabel : btnLabels) {
         bottomPanel.add(new JButton(btnLabel));
      }

      setLayout(new BorderLayout());
      add(topPanel, BorderLayout.PAGE_START);
      add(Box.createRigidArea(new Dimension(400, 200)), BorderLayout.CENTER);
      add(bottomPanel, BorderLayout.PAGE_END);
   }

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

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

顯示為:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM