gpt4 book ai didi

java - 如何使 ImageIcon 适合 JButton 边框

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:31:39 24 4
gpt4 key购买 nike

我想给一些 JButton 上色,这里的一些其他问题向我展示了,这样会更容易绘制一个小图像(用 gimp 完成)并将其设置为 JButton 的图标。

按钮的数量和大小应该是可变的(它们在网格中),所以我想要一个高分辨率的图像,我可以根据需要缩放它。

现在的问题是,我不知道如何“切割图标的边缘”,因为按钮的边缘是圆角的。

Pic is not inside the borders of the button

在这里您可以看到图像不在按钮边框内。

这是我在类中扩展 JButton 的方法。

public void setYellow() {
URL u = getClass().getResource("/img/yellow.png");
ImageIcon i = new javax.swing.ImageIcon(u);
//Image img = i.getImage();
//img = img.getScaledInstance(size, size, java.awt.Image.SCALE_SMOOTH);
//i = new ImageIcon(img);
setIcon(i);
}

编辑

package test;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import control.Control;
import view.Field;
import view.View;

public class HelloWorldSwing {

/**
* @param args
*/
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestView.initialize();
}
});
}

}

class TestView {
private static TestView view = new TestView();
public static TestView getView() {
return view;
}

private TestView() {
JFrame frame = new JFrame("HelloWorldSwing");
frame.setLayout(new GridLayout(0,3));
int buttonSize = 40;

frame.getContentPane().add(new MyButton(buttonSize));
frame.getContentPane().add(new MyButton(buttonSize));
frame.getContentPane().add(new MyButton(buttonSize));

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}

public static void initialize() {
}
}

class MyButton extends JButton {

int size;
public MyButton(int size) {
this.size = size;
setPreferredSize(new Dimension(size, size));
this.addActionListener(new ButtonHandler());
setBorder(LineBorder.createGrayLineBorder());
setOpaque(true);
}

public void setYellow() {
//URL u = getClass().getResource("/img/test.png"); // 64x64 png pic
URL u1 = null;
try {
u1 = new URL("http://assets1.qypecdn.net/uploads/users/0195/7210"
+ "/calvin_yellow_original_thumb.jpg");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ImageIcon i = new javax.swing.ImageIcon(u1);
// Image img = i.getImage();
// img = img.getScaledInstance(size, size, java.awt.Image.SCALE_SMOOTH);
// i = new ImageIcon(img);
setIcon(i);
// setBorderPainted(false);
// setContentAreaFilled(false); did not help
}
}

class ButtonHandler implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
MyButton mb = (MyButton) e.getSource();
mb.setYellow();
}
}

编辑 2

这里是 setYellow() 中的行的图片

setBorderPainted(false);
setContentAreaFilled(false);

没有被注释掉(不幸的是没有区别)

点击按钮之前:

enter image description here

点击按钮后:

enter image description here

更新

我在 MyButton 构造函数中添加了 Borders

setBorder(LineBorder.createGrayLineBorder());

现在图标位于按钮边框内。我添加了图片。

enter image description here

enter image description here

但是如您所见,我们不再有这些圆形按钮边缘了。

最佳答案

button.setBorderPainted(false);
button.setContentAreaFilled(false);

this answer 所示.

更新

如果不是这个,我不太明白你想要达到的目标。

12 Yellow buttons w/ orange rollover icon

我将鼠标悬停图标设为橙色,这样我们可以很容易地看到一个按钮的大小,否则我将 4 个排成一排,以确保最小框架宽度不会在一排按钮之间插入额外的空间。

import java.awt.*;
import java.awt.Image;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class HelloWorldSwing {

public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestView.getView();
}
});
}
}

class TestView {

private static TestView view = new TestView();

public static TestView getView() {
return view;
}

private TestView() {
JFrame frame = new JFrame("HelloWorldSwing");
frame.setLayout(new GridLayout(3,4));
int buttonSize = 40;

for (int i=0; i<12; i++) {
frame.getContentPane().add(new MyButton(buttonSize));
}

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}

public static void initialize() {
}
}

class MyButton extends JButton {

int size;

public MyButton(int size) {
this.size = size;
setPreferredSize(new Dimension(size, size));
this.addActionListener(new ButtonHandler());
setOpaque(true);
setYellow();
}

public Image getImage(int sz, Color color) {
BufferedImage bi = new BufferedImage(sz,sz,BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.setColor(color);
g.fillRect(0, 0, sz, sz);

g.dispose();
return bi;
}

public void setYellow() {
Image img = getImage(64, Color.YELLOW).getScaledInstance(size, size, java.awt.Image.SCALE_SMOOTH);
setIcon(new ImageIcon(img));
Image rollover = getImage(64, Color.ORANGE).getScaledInstance(size, size, java.awt.Image.SCALE_SMOOTH);
setRolloverIcon(new ImageIcon(rollover));
setBorderPainted(false);
setContentAreaFilled(false);
}
}

class ButtonHandler implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
MyButton mb = (MyButton) e.getSource();
mb.setYellow();
}
}

关于java - 如何使 ImageIcon 适合 JButton 边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13209850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com