Добавление изображения в Jbutton с надписью на переднем плане

Друзья, я пытаюсь добавить изображение в мой Jbutton, используя метод seticon, но это скрывает текстовую метку на кнопке. Вот код:

      try {
        Image img = ImageIO.read(getClass().getResource("image.jpg"));
        studentsButton.setIcon(new ImageIcon(img));         
      } catch (IOException ex) {
      }

И я использую качание в затмении без init () / paint () / graphics, его простой кадр в основном методе.

 Guillaume Polet11 июл. 2012 г., 09:55
1) Никогда не отлавливайте исключения, не сообщая о них: ни в журнал, ни на консоль, какие бы другие сообщения вы ни указывали. 2) опубликоватьSSCCE
 Mach Mitch11 июл. 2012 г., 11:12
хорошо, я буду помнить это, спасибо

Ответы на вопрос(1)

Решение Вопроса

Просто использовать

studentsButton.setHorizontalTextPosition(AbstractButton.CENTER);
studentsButton.setVerticalTextPosition(AbstractButton.BOTTOM);

Это просто разместит текст под изображением. И вывод будет таким:

Вот один пример кода для вашей помощи, имеяOUTPUT как вывод:

import java.awt.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;
import javax.imageio.ImageIO;

public class ButtonImageExample
{
    private JButton imageButton;
    private ImageIcon image;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Button Image Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        try
        {
            image = new ImageIcon(ImageIO.read(
                    new URL("http://i.imgur.com/6mbHZRU.png")));
        }
        catch(MalformedURLException mue)
        {
            mue.printStackTrace();
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }       

        imageButton = new JButton("Button Text");
        imageButton.setIcon(image);
        imageButton.setHorizontalTextPosition(AbstractButton.CENTER);
        imageButton.setVerticalTextPosition(AbstractButton.BOTTOM);

        contentPane.add(imageButton);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ButtonImageExample().displayGUI();
            }
        });
    }
}

LATEST EDIT : REGARDING ADDING BACKGROUND IMAGE THROUGH JLABEL

import java.awt.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;
import javax.imageio.ImageIO;

public class ButtonImageExample
{
    private ImageIcon image, imageForLabel;
    private JLabel imageLabel;

    private JTextField userField;
    private JPasswordField passField;
    private JButton loginButton;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Button Image Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));
        try
        {
            image = new ImageIcon(ImageIO.read(
                    new URL("http://i.imgur.com/jwyrvXC.gif")));
            imageForLabel = new ImageIcon(ImageIO.read(
                    new URL("http://i.imgur.com/09zgEvG.jpg")));           
        }
        catch(MalformedURLException mue)
        {
            mue.printStackTrace();
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }       

        imageLabel = new JLabel(imageForLabel);
        JPanel basePanel = new JPanel();
        // setOpaque(false) is used to make the JPanel translucent/transparent.
        basePanel.setOpaque(false);
        basePanel.setLayout(new BorderLayout(5, 5));
        JPanel topPanel = new JPanel();     
        topPanel.setOpaque(false);
        topPanel.setLayout(new GridLayout(2, 2, 5, 5));
        JLabel userLabel = new JLabel("USERNAME : ", JLabel.CENTER);
        userLabel.setForeground(Color.WHITE);
        userField = new JTextField(10);
        JLabel passLabel = new JLabel("PASSWORD : ", JLabel.CENTER);
        passLabel.setForeground(Color.WHITE);
        passField = new JPasswordField(10);

        topPanel.add(userLabel);
        topPanel.add(userField);
        topPanel.add(passLabel);
        topPanel.add(passField);

        JPanel bottomPanel = new JPanel();
        bottomPanel.setOpaque(false);
        loginButton = new JButton("Click to LOGIN");
        loginButton.setIcon(image);
        loginButton.setHorizontalTextPosition(AbstractButton.CENTER);
        loginButton.setVerticalTextPosition(AbstractButton.BOTTOM);
        bottomPanel.add(loginButton);

        basePanel.add(topPanel, BorderLayout.CENTER);
        basePanel.add(bottomPanel, BorderLayout.PAGE_END);

        imageLabel.setLayout(new GridBagLayout());
        imageLabel.add(basePanel);

        contentPane.add(imageLabel, BorderLayout.CENTER);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ButtonImageExample().displayGUI();
            }
        });
    }
}

Вот результат того же:

JLabelAsBackground

 11 июл. 2012 г., 11:15
@MachMitch для этого использует JLabel
 Mach Mitch11 июл. 2012 г., 11:11
Не могли бы вы также сказать мне, как изменить фоновое изображение для JPanel без использования подкласса?
 11 июл. 2012 г., 11:50
Как предлагает @GuillaumePolet, вы можете использоватьJLabel для этого установите егоLayout и добавить компоненты к нему. Дайте мне немного времени для примера.
 Mach Mitch11 июл. 2012 г., 22:24
действительно хороший пример, но я уже спроектировал свой макет, и теперь добавить все в JLabel было бы очень сложно, так как я уже использовал 16 JPanels ..... будет легко обеспечить панель фоновым изображением вместо того, чтобы портить весь макет

Ваш ответ на вопрос