JFrame在带有图片的标签中绘制文本

时间:2014-07-13 02:59:45

标签: java swing jframe jlabel layout-manager

我试图在带有图片和一些按钮的标签上显示文字,但我注意到图像和文字都设置在同一个地方,这导致文字被图片覆盖。

我试图找到单独显示和设置边界的方法,但我找不到任何方法,如果我添加另一个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);
    }

(这是针对学校的一个项目,因此在其他平台上运行的重要性应该较低)

这就是我得到的

enter image description here

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

这就是我想要做的事情

enter image description here

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

1 个答案:

答案 0 :(得分:4)

您的问题看起来主要是您不使用布局管理器而是依赖于null布局和setBounds(...)。同样,这使得一些非常脆弱的GUI,非常难以增强,调试或更改。相反,为什么不让布局经理为你做繁重的工作?

  • 如果这是我的GUI,我会让整个GUI(JFrame的contentPane)使用BorderLayout,实际上它已经默认使用了。我将顶部图像和文本放入JPanel并将该JPanel放入contentPane BorderLayout.NORTH。
  • 我会让顶级JPanel使用BoxLayout然后添加我的图像显示JLabel,然后添加另一个JPanel,它在GridLayout(0,1)中保存JLabel(1列,可变行数)。
  • 我将我的JButton放入一个使用GridLayout(2,4)的JPanel,然后将这个按钮JPanel放入主按钮BorderLayout.SOUTH。

例如:

enter image description here


例如:

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();
         }
      });
   }
}

显示为:

enter image description here