【问题标题】:Java Swing: How to set text on a self customized Jbutton?Java Swing:如何在自定义的 Jbutton 上设置文本?
【发布时间】:2020-12-13 04:54:50
【问题描述】:

这是我的 JButton 代码:

JButton Savebtn = new JButton();//("Save");
Savebtn.setFont(btnFont);
Savebtn.setOpaque(false);
Savebtn.setContentAreaFilled(false);
Savebtn.setBorder(null);
Savebtn.setMargin(new Insets(0, 0, 0, 0));
Savebtn.setIcon(new ImageIcon("src/Pic2/menubtn0.png"));
Savebtn.setPressedIcon(new ImageIcon("src/Pic2/menubtn1.png"));
//Savebtn.setText("Save");

效果是这样的:

我尝试过这样做:

JButton Savebtn = new JButton();//("Save");
Savebtn.setFont(btnFont);
Savebtn.setOpaque(false);
Savebtn.setContentAreaFilled(false);
Savebtn.setBorder(null);
Savebtn.setMargin(new Insets(0, 0, 0, 0));
Savebtn.setIcon(new ImageIcon("src/Pic2/menubtn0.png"));
Savebtn.setPressedIcon(new ImageIcon("src/Pic2/menubtn1.png"));
Savebtn.setText("Save");

文字未出现,右侧出现白线。 谁能帮我解决这个问题?

PS:我不能只把文字放在我的图片上,因为我要显示的按钮文字与我的程序有关。

按钮图片:

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。 2) 例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。例如。 this answer 中的代码热链接到嵌入在this question 中的图像。 3) 应用程序资源在部署时将成为嵌入式资源,因此明智的做法是立即开始访问它们。 ..
  • .. embedded-resource 必须通过 URL 而不是文件访问。请参阅info. page for embedded resource 了解如何形成 URL。
  • 4) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。 5) 考虑使用工厂方法来配置这些按钮。使用方法的参数,传递按钮文本和两个图标/图标路径。
  • 您有 3 个答案 不要忘记“接受”最能描述问题并提供解决方案的答案,以便人们知道问题已经解决。见:What should I do when someone answers my question
  • 非常抱歉我在放置图像和命名方面的错误,并感谢所有帮助编辑的人。也很抱歉因为太忙而没有尽快查看答案。我现在已经选择了最好的解决方案,而且非常简单明了。希望对有类似问题的朋友有所帮助!

标签: java swing text jbutton


【解决方案1】:

文字没有出现,右侧出现白线

我怀疑您的问题是您没有使用布局管理器(或者您正在手动设置按钮的首选大小)并且您的按钮大小不正确并且文本被截断。

默认情况下,文本将显示在图标的右侧。所以你看到的是你的图标,然后是图标和文本之间的差距。

您需要将按钮配置为在图标顶部居中显示(不是图标右侧):

JButton button = new JButton( "Save" );
button.setIcon(...);
button.setPressedIcon(...);   
button.setHorizontalTextPosition(JLabel.CENTER);
button.setVerticalTextPosition(JLabel.CENTER);

【讨论】:

  • 不错的答案,无需像我的那样扩展课程。对此 +1。
  • 我用过这个——很容易申请。感谢代码和解释,你真的帮了我很多!
【解决方案2】:

我把你的代码 sn-p 放到我创建的 GUI 中。

这是我想出的。

现在,它不是一个响应速度非常快的按钮。你无法判断它是否被按下。

我所做的是注释掉所有不寻常的 JButton 方法,并确保我可以显示一个普通的 JButton。

然后我一次取消注释一行并进行测试。

测试,测试,测试。

这是我测试的代码。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class CustomButtonGUI implements Runnable {

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

    @Override
    public void run() {
        JFrame frame = new JFrame("Custom Button");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createButtonPanel(), BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createButtonPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setPreferredSize(new Dimension(300, 100));
        
        Font font = panel.getFont().deriveFont(48f);
        
        JButton saveButton = new JButton("Save");
        saveButton.setFont(font);
        saveButton.setOpaque(false);
        saveButton.setContentAreaFilled(false);
        saveButton.setBorder(null);
        saveButton.setMargin(new Insets(0, 0, 0, 0));
//      saveButton.setIcon(new ImageIcon("src/Pic2/menubtn0.png"));
//      saveButton.setPressedIcon(new ImageIcon("src/Pic2/menubtn1.png"));
//      
        panel.add(saveButton, BorderLayout.CENTER);
        
        return panel;
    }

}

【讨论】:

  • 只是出于兴趣,这如何回答 OP 的问题?您注释掉了 OP 所说的导致问题的 2 行?所以不确定答案的重点
  • @David Kroukamp:在发表此评论时,问题是“如何在自定义 JButton 上设置文本?”我在自定义的 JButton 上显示了文本。如果 OP 要我使用图像。 OP必须提供图像。无论如何,我的答案是站得住脚的。测试,测试,测试,测试。
  • 啊,我明白了……好吧,酷只是想知道伙计!感谢您的澄清。是的,测试、调试、注释和测试更多?编程的生命,哈哈。 +1
【解决方案3】:

我认为你使用了JButton 错误,setIconsetPressedIcon 字面意思是JButton 旁边的图标,但是,对于一个游戏,你可能希望从一个按下时改变背景图像到另一个,默认情况下JButton 类不支持。

这是我制作的自定义JButton,它允许这样做:

CustomJButton.java:

import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.JButton;

public class CustomJButton extends JButton {

    private final BufferedImage normalIcon;
    private final BufferedImage selectedIcon;

    public CustomJButton(BufferedImage normalImage, BufferedImage selectedImage) {
        super();
        setOpaque(false);
        setContentAreaFilled(false);
        setBorder(null);
        setFocusPainted(false);
        setMargin(new Insets(0, 0, 0, 0));
        this.normalIcon = normalImage;
        this.selectedIcon = selectedImage;
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(normalIcon.getWidth(), normalIcon.getHeight());
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        // lets anti-alias for better quality
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        // lets anti-alias for text too
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

        // lets draw the correct image depending on if the button is pressed or not
        if (getModel().isPressed()) {
            g2d.drawImage(selectedIcon, 0, 0, getWidth(), getHeight(), this);
        } else {
            g2d.drawImage(normalIcon, 0, 0, getWidth(), getHeight(), this);
        }

        // calc string x and y position
        Font font = getFont();
        String text = getText();
        FontMetrics metrics = g2d.getFontMetrics(font);
        int textWidth = metrics.stringWidth(text);
        int textHeight = metrics.getHeight();
        int textY = getWidth() / 2 - textWidth / 2;
        int textX = getHeight() / 2 - textHeight / 2 + metrics.getAscent();

        // draw the text
        g2d.drawString(text, textY, textX);
    }
}

然后你会像这样使用它:

CustomJButton button = new CustomJButton(ImageIO.read(new URL("https://i.stack.imgur.com/xCGQQ.png")), ImageIO.read(new URL("https://i.stack.imgur.com/R9i1s.png")));
button.setFont(new Font("Jokerman", Font.BOLD, 22));
button.setForeground(Color.WHITE);
button.setText("Press Me!");
button.addActionListener((ActionEvent e) -> {
    JOptionPane.showMessageDialog(frame, "You pressed me");
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2011-06-29
    • 2021-10-29
    • 2010-09-26
    • 2013-08-19
    相关资源
    最近更新 更多