1

是否有任何框架或工具来开发精美的 Java 应用程序 - 具有良好拖放功能的用户界面?

例如,来自 Mac OS 的这个:http: //appzapper.com/

在此处输入图像描述

它不需要具有 Mac OS 的外观和感觉。

4

2 回答 2

6

请参阅教程中的DnD 简介以开发一些有效的代码。


请查看第一篇文章的屏幕截图,了解 nice 的规范。

唯一的自定义部分是向下箭头的虚线边框及其下方的文本。您可以在文本的 HTML 格式中使用图标(用于箭头/边框)JLabel来实现这一点。

例如

标签中带有 HTML 格式文本的图标

package test.t100.t006;

import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class DrawLabel {
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                // substitute for downward pointing arrow with dashed border
                Object obj = UIManager.getDefaults()
                        .get("OptionPane.warningIcon");
                if (obj!=null && obj instanceof Icon) {
                    Icon icon = (Icon)obj;
                    String text = "<html><body>Drag <em><b>Stuff</b></em> Here";
                    JLabel l = new JLabel(
                            text, icon, SwingConstants.HORIZONTAL);
                    l.setVerticalTextPosition(SwingConstants.BOTTOM);
                    l.setHorizontalTextPosition(SwingConstants.CENTER);
                    JOptionPane.showMessageDialog(
                            null, l);
                }
            }
        });
    }
}
于 2012-05-25T08:35:44.887 回答
3

享受截图,享受它:)

import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;
public class DragHereIcon implements Icon {
  private int size = 80;
  private float a = 4f;
  private float b = 8f;
  private int r = 16;
  private int f = size/4;
  private Font font = new Font("Monospace", Font.PLAIN, size);
  private FontRenderContext frc = new FontRenderContext(null, true, true);
  private Shape s = new TextLayout("\u21E9", font, frc).getOutline(null);
  private Color linec = Color.GRAY;
  @Override public void paintIcon(Component c, Graphics g, int x, int y) {
    Graphics2D g2 = (Graphics2D)g.create();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
    g2.translate(x, y);

    g2.setStroke(new BasicStroke(a));
    g2.setPaint(linec);
    g2.draw(new RoundRectangle2D.Float(a,a,size-2*a-1,size-2*a-1,r,r));

    g2.setStroke(new BasicStroke(b));
    g2.setColor(UIManager.getColor("Panel.background"));
    g2.drawLine(1*f,0*f,1*f,4*f);
    g2.drawLine(2*f,0*f,2*f,4*f);
    g2.drawLine(3*f,0*f,3*f,4*f);
    g2.drawLine(0*f,1*f,4*f,1*f);
    g2.drawLine(0*f,2*f,4*f,2*f);
    g2.drawLine(0*f,3*f,4*f,3*f);

    g2.setPaint(linec);
    Rectangle2D b = s.getBounds();
    Point2D.Double p = new Point2D.Double(
        b.getX() + b.getWidth()/2d, b.getY() + b.getHeight()/2d);
    AffineTransform toCenterAT = AffineTransform.getTranslateInstance(
        size/2d - p.getX(), size/2d - p.getY());
    g2.fill(toCenterAT.createTransformedShape(s));
    g2.translate(-x,-y);
    g2.dispose();
  }
  @Override public int getIconWidth()  {
    return size;
  }
  @Override public int getIconHeight() {
    return size;
  }
  public static JComponent makeUI() {
    JLabel label = new JLabel(new DragHereIcon());
    label.setText("<html>Drag <b>Stuff</b> Here");
    label.setVerticalTextPosition(SwingConstants.BOTTOM);
    label.setHorizontalTextPosition(SwingConstants.CENTER);
    label.setForeground(Color.GRAY);
    label.setFont(new Font("Monospace", Font.PLAIN, 24));
    JPanel p = new JPanel();
    p.add(label);
    p.setBorder(BorderFactory.createEmptyBorder(8,8,8,8));
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(DragHereIcon.makeUI());
    f.setSize(320, 200);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
于 2012-05-25T10:26:44.507 回答