针对Java的9补丁式图像缩放?

针对Java的9补丁式图像缩放?,java,swing,Java,Swing,我不确定这是不是一个合适的地方,但我想知道android上是否有类似9个补丁的图片,但对于Java,比如Oracle,PC Java。我所有的谷歌搜索都只显示安卓系统,因为人们称之为Java,但实际上并不相同 我已经找到了LibGdx,但它对于我正在寻找的单九补丁能力来说是相当强大的 九面片图像是一个具有“9”区域的图像,通常边角“不缩放”,边墙和中心区域拉伸以适应屏幕。 Android的一个例子: 有人知道有什么东西可以像这样扩展吗?我需要一些支持PNG的东西。如果你正在寻找一种在Java组件

我不确定这是不是一个合适的地方,但我想知道android上是否有类似9个补丁的图片,但对于Java,比如Oracle,PC Java。我所有的谷歌搜索都只显示安卓系统,因为人们称之为Java,但实际上并不相同

我已经找到了LibGdx,但它对于我正在寻找的单九补丁能力来说是相当强大的

九面片图像是一个具有“9”区域的图像,通常边角“不缩放”,边墙和中心区域拉伸以适应屏幕。 Android的一个例子:


有人知道有什么东西可以像这样扩展吗?我需要一些支持PNG的东西。

如果你正在寻找一种在Java组件上使用9补丁映像的方法,我在这里问了同样的问题:简短的回答是不,你不能

长的一个是:如果您将图像拆分为9个图像(边框、角点和中心),并创建一个组件,当重新绘制时,该组件将移动图像并调整图像大小,则可以

下面的示例适用于我的情况,其中:

  • 该组件是一个JPanel
  • 面板的中心必须是透明的,所以我需要少一张图片
  • 组件不会小于给定的图像
  • 图像具有透明性,这解释了代码中的setOpaque(false)调用
  • 该守则是一份草稿
代码如下:

public class NinePatchLikePanel extends JPanel{
private JPanel corner_top_l;
private JPanel corner_top_r;
private JPanel corner_bot_l;
private JPanel corner_bot_r;

private JPanel border_ver_l;
private JPanel border_ver_r;
private JPanel border_hoz_t;
private JPanel border_hoz_b;

private int min_width, min_height;

private int corners_width;
private int corners_height;
private int borders_width;
private int borders_height;


public NinePatchLikePanel (String[] urls) {

    if(urls.length != 8) {
        throw new UnsupportedOperationException("Exception to be managed!");
    } else {
        corner_top_l = new JPanelWithBackground (urls [0]);
        corner_top_r = new JPanelWithBackground (urls [1]);
        corner_bot_r = new JPanelWithBackground (urls [2]);
        corner_bot_l = new JPanelWithBackground (urls [3]);

        border_hoz_t = new JPanelWithBackground (urls [4]);
        border_ver_r = new JPanelWithBackground (urls [5]);
        border_hoz_b = new JPanelWithBackground (urls [6]);
        border_ver_l = new JPanelWithBackground (urls [7]);

        corners_width   = corner_top_l.getWidth();
        corners_height  = corner_top_l.getHeight();

        borders_width   = border_hoz_t.getWidth();  
        borders_height  = border_ver_l.getHeight();

        min_width   = 2 * corners_width  + borders_width;
        min_height  = 2 * corners_height + borders_height;

        this.setSize (min_width, min_height );
        this.setMinimumSize ( new Dimension (min_width, min_height) );
        this.setOpaque(false);
        this.setLayout(null);
        this.add(corner_top_l);
        this.add(corner_top_r);
        this.add(corner_bot_l);
        this.add(corner_bot_r);

        this.add(border_hoz_t);
        this.add(border_ver_r);
        this.add(border_hoz_b);
        this.add(border_ver_l);
    }
}

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

    int actual_width = this.getWidth();
    int actual_height = this.getHeight();

    int _x = actual_width - corners_width;
    int _y = actual_height - corners_height;

    corner_top_l.setLocation(0, 0);
    corner_top_r.setLocation(_x, 0);
    corner_bot_l.setLocation(0, _y);
    corner_bot_r.setLocation(_x, _y);

    int new_borders_width  = _x - corners_width;
    int new_borders_height = _y - corners_height;


    border_hoz_t.setLocation(corners_width, 0);
    border_hoz_t.setSize(new_borders_width, border_hoz_t.getHeight());

    border_ver_r.setLocation(_x, corners_height);
    border_ver_r.setSize(border_ver_r.getWidth(), new_borders_height);

    border_hoz_b.setLocation(corners_width, _y);
    border_hoz_b.setSize(new_borders_width, border_hoz_b.getHeight());

    border_ver_l.setLocation(0, corners_height);
    border_ver_l.setSize(border_ver_l.getWidth(), new_borders_height);
}

}
以下是JPanelWithBackground类的代码:

public class JPanelWithBackground extends JPanel { 
Image bg = null; 

public JPanelWithBackground(String url) { 
    try{
        bg = ImageIO.read(getClass().getResourceAsStream(url));
        int height = bg.getHeight(null);
        int width  = bg.getWidth(null);
        Dimension d = new Dimension(width,height);
        this.setSize (width, height);
        this.setMinimumSize ( d );
        this.setOpaque(false); 
    } catch (IOException ex) {
        //TODO: Manage this exception in a better way
            System.err.println(ex);
            System.exit(1);
    }  
} 

@Override
public void paintComponent(Graphics g) { 
    super.paintComponent(g);
    if (bg != null)
        g.drawImage(bg, 0, 0, this.getWidth(), this.getHeight(), null);
}
} 

谷歌
类似的摇摆按钮9-patch
你要找的就是
weblookandfeel
的前几个链接。使用java2d/imageio。您可以使用正确的平移和缩放(仿射变换)在BuffereImage上绘制所有内容,并使用imageio将其写入PNG