簡體   English   中英

Java shebang 應用程序中的圖標資源

[英]Icon resources in a Java shebang application

我有一個 Java shebang 腳本,它顯示了一些 UI(JFrame 等),我必須提供圖標“放大”、“縮小”、“重置縮放”,可能還有更多。

如何使用 Java shebang 腳本中的圖標?

我在 Linux 下進行開發,但用戶可能使用的是 Windows 或 Mac。 (我還沒有嘗試在 Windows 或 Mac 上運行我的應用程序。)我使用 shebang 腳本,因為我希望用戶只接收一個可執行文件。 可能還有其他選擇。

UPD 作為一種解決方法,我使用static void loadIcon(JButton button, String resourcePath, String altText)如果無法加載圖標,則設置按鈕的文本。 結果,應用程序在作為腳本運行時看起來有點難看,但仍然可以作為腳本運行。

要為 Linux 提供圖標,您通常會將一些不同大小和格式的圖標文件(至少一個具有 32x32 像素 .png 的圖標文件)放入啟動腳本所在的同一文件夾或“圖標”子文件夾中。 然后用戶可以配置該圖標以及他的開始菜單條目。 您的程序可能還提供了一個配置腳本,可以自動添加開始菜單條目,但是市場上有很多不同的桌面版本,每個版本都有自己的方法。 我會把它留給用戶手動完成。

除非用戶安裝 CygWin 或 Linux 子系統,否則 Shebang 腳本將無法在 Windows 下運行。

對於 Windows,您必須編寫 .cmd 或 .bat 腳本,但是它們也不能有嵌入的圖標。 因此,許多用於 Windows 的 Java 程序都帶有一個運行啟動腳本的啟動 .exe。 .exe 可以包含一個圖標。 .exe 程序必須使用 Microsoft 特定的開發環境進行開發。 您可以在 Microsoft 知識庫中找到說明。

有免費的工具可以生成這樣的包裝程序。 本教程中描述了其中之一: https ://medium.com/@sulabh4/how-to-make-a-executable-file-from-your-java-code-3f521938ae5c

您總是可以在代碼中生成自己的圖標:

#!/usr/bin/java --source 11

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class StarIcon extends JPanel {

  private static final int I_SIZE = 40;
  private static final double D_SIZE = I_SIZE;

  public static void main(String[] args) {
    JFrame frame = new JFrame("Star Icon");
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    frame.setLocationByPlatform(true);
    frame.add(new StarIcon(), BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
  }
  
  StarIcon() {
    super(new BorderLayout());
    Image image = makeStarImage();
    Icon icon = new ImageIcon(image);
    JLabel label = new JLabel("Star", icon, SwingConstants.LEFT);

    // double the font size, just for fun.
    Font labelFont = label.getFont();
    label.setFont(labelFont.deriveFont(labelFont.getSize()*2.0f));

    final int ms = I_SIZE*10;
    final Color bg = label.getBackground();
    label.setBorder(BorderFactory.createMatteBorder(ms, ms, ms, ms, bg));
    add(BorderLayout.CENTER, label);
  }

  private static Image makeStarImage() {
    final double starRad = D_SIZE * 0.4;
    Point2D[] points = {
        toRect(starRad, 0.0),
        toRect(starRad, 144.0),
        toRect(starRad, 288.0),
        toRect(starRad, 72.0),
        toRect(starRad, 216.0),
        toRect(starRad, 0.0)
    };
    double center = D_SIZE/2.0;
    double side = D_SIZE;
    double arc = D_SIZE*0.3;
    RoundRectangle2D border = new RoundRectangle2D.Double(0, 0, side, side, arc, arc);

    GeneralPath star = new GeneralPath();
    star.moveTo(points[0].getX(), points[0].getY());
    for (int i=1; i<points.length; ++i) {
      star.lineTo(points[i].getX(), points[i].getY());
    }
    Image image = new BufferedImage(I_SIZE, I_SIZE, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = (Graphics2D) image.getGraphics();
    g2.setRenderingHint(
        RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON
    );

    g2.setColor(Color.WHITE);
    g2.fill(border);
    AffineTransform savedTransform = g2.getTransform();
    g2.translate(center, center);
    g2.setColor(Color.BLUE);
    g2.fill(star);
    g2.setTransform(savedTransform);
    g2.dispose();
    return image;
  }

  @SuppressWarnings("SameParameterValue")
  private static Point2D toRect(double r, double thetaDeg) {
    double thetaRad = (thetaDeg * Math.PI) / 180.0;
    final double x = r * StrictMath.sin(thetaRad);
    final double y = -r * StrictMath.cos(thetaRad);
    return new Point2D.Double(x, y);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM