3

私はいくつかの JButton に色を付けたいと思っています。ここでの他のいくつかの質問は、小さな画像をペイントし (gimp で行いました)、JButton のアイコンとして設定する方が簡単であることを示しました。

ボタンの数とサイズは可変 (グリッド内) にする必要があるため、必要に応じてスケーリングできる高解像度の画像が必要です。

問題は、ボタンのエッジが丸くなっているため、アイコンの「エッジをカット」する方法がわからないことです。

画像がボタンの枠内にありません

ここで、画像がボタンの境界線の内側にないことがわかります。

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

コメントアウトされていません(残念ながら違いはありません)

ボタンがクリックされる前:

ここに画像の説明を入力

ボタンをクリックした後:

ここに画像の説明を入力

アップデート

MyButton コンストラクターに Borders を追加しました

setBorder(LineBorder.createGrayLineBorder());

アイコンがボタンの枠内に収まるようになりました。写真を追加しました。

ここに画像の説明を入力

ここに画像の説明を入力

しかし、ご覧のとおり、丸みを帯びたボタンのエッジはもうありません。

4

1 に答える 1