2011-05-13 251 views
4

我正在用Java构建一个扑克赔率计算器应用程序。我想通过点击卡片的占位符来选择一张新卡片,该占位符基本上是一个扩展的JPanel,用于“绘制”卡片的脸部并具有mouseListener。Java中的透明圆形对话框

我想象要做的事情是,当我点击卡时,我想要一个圆形菜单在中间有一个圆圈的鼠标光标周围弹出,每个套件在四分之一和四周环它为卡的价值削减了13。然后我会选择西装和价值,它会消失。你知道我能做到这一点吗?我研究了一下,我认为可以通过制作透明的JDialog来完成JavaFX,但我不确定。

有没有一种方法可以绘制一个完全自定义的形状的JComponent,比如每个四分之一圆形的JButton等等。我有一些Java的经验,但不是GUI构建。

提前感谢您的时间。

编辑:使用您的评论和回答我的问题关于圆形对话框(不知道这是否是最好的方式来做到这一点,但现在的作品)。现在,无论如何,我知道在没有对坐标进行硬编码的情况下,点击属于哪个区域(如果点击位于有用区域)?

+0

@“paint”的“带有重写绘图方法的JPanel”是否意味着'paintComponent'?最后一个是在'JPanel'中用于自定义绘画的。 – 2011-05-13 12:57:50

+0

FAIL:P最初我已经抽取了draw(),但现在我甚至没有这样做......呃我很困惑:P修正了这个... – 2011-05-13 13:54:20

回答

4

我会建议做自定义图形,而不是尝试自定义JButton等。当您单击JPanel时,可以使用java.awt.Shape接口及其各种实现(如java.awt.geom.Ellipse2D)绘制圆等。

这些形状带有contains()方法,可以告诉你点是否在Shape中。这样,当用户下次点击JPanel时,可以通过检查所有形状来确定用户点击了哪个形状。

+2

为什么JPanel而不是简单的JComponent? – 2011-05-13 12:25:11

+0

我会尽力做到这一点......我不擅长图形,但我会看看我能做些什么。我会给一些反馈。 – 2011-05-13 13:59:32

+0

@Jens Schauder你说得对或是课程,但是OP正在谈论绘制JPAnel,我一次只想到一件事。 – 2011-05-13 14:50:34

0

代码来创建图形是这样的情况下,任何人都需要它:

import java.awt.Color; 
import java.awt.Font; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Paint; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Line2D; 
import java.awt.geom.Point2D.Double; 
import javax.swing.JDialog; 

/** 
* 
* @author Dimitris Klimis <dnklimis at gmail.com> 
*/ 
public class CardChooser extends JDialog implements MouseListener { 

    int sizeX = 140; 
    int sizeY = sizeX; //in case I don't want it to be circle 
    int x, y; 
    Point point; 

    public CardChooser(Point point) { 
     x = point.x; 
     y = point.y; 
     this.point = point; 
     this.initComponents(); 
    } 

    public static int[] getCard(Point point) { 
     int[] output = {0, 0}; 
     CardChooser chooser = new CardChooser(point); 
     return output; 
    } 

    @Override 
    public void paint(Graphics g) { 
     if (g instanceof Graphics2D) { 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 
      //Drawing the transparent dialog 
      g2.setPaint(new Color(0.0f, 0.0f, 0.0f, 0.0f)); 
      g2.fillRect(0, 0, getWidth(), getHeight()); 

      //Drawing the circles 
      g2.setColor(Color.BLACK); 
      drawCircle(g2, 100, new GradientPaint(0.0f, 0.0f, Color.darkGray, (float) getWidth(), (float) getHeight(), Color.lightGray, false)); 
      drawLines(g2, 13, 100); 
      int smallCircle = 38; 
      drawCircle(g2, smallCircle + 3, Color.GRAY); 
      drawCircle(g2, smallCircle, new GradientPaint((float) (getWidth() * 0.25), (float) (getHeight() * 0.25), Color.lightGray, (float) (getWidth() * 0.75), (float) (getHeight() * 0.75), Color.darkGray, false)); 
      drawLines(g2, 4, smallCircle); 
      drawCircle(g2, 10, Color.LIGHT_GRAY); 
      drawSuiteLetters(g2); 
      drawCardValues(g2); 
      drawClosingX(g2); 
     } else { 
      super.paint(g); 
     } 
    } 

    private void drawCircle(Graphics2D g2, int percentage, Paint fill) { 
     double perc = (double) percentage/100.0; 
     Ellipse2D ellipse = new Ellipse2D.Double(((1 - perc)/2) * sizeX, ((1 - perc)/2) * sizeY, perc * sizeX, perc * sizeY); 
     g2.setPaint(fill); 
     g2.fill(ellipse); 
     g2.setColor(Color.BLACK); 
     g2.draw(ellipse); 
    } 

    private void drawLines(Graphics2D g2, int outOf, int percentage) { 
     double rads = Math.toRadians(360.0/outOf); 
     double perc = (double) percentage/100.0; 
     Double zeroAxis = new Point.Double(sizeX/2.0, sizeY/2.0); 
     for (int i = 0; i < outOf; i++) { 
      g2.draw(new Line2D.Double(zeroAxis.x, zeroAxis.y, zeroAxis.x + (zeroAxis.x * perc * Math.sin(rads * i)), zeroAxis.y + (zeroAxis.y * perc * Math.cos(rads * i)))); 
     } 
    } 

    private void drawSuiteLetters(Graphics2D g2) { 
     Double zeroAxis = new Point.Double(sizeX/2.0, sizeY/2.0); 
     g2.setFont(new Font("Courier New", Font.BOLD, 25)); 
     g2.drawString("\u2660", (float) zeroAxis.x - 18, (float) zeroAxis.y - 5);//spades 
     g2.drawString("\u2663", (float) zeroAxis.x + 3, (float) zeroAxis.y + 20);//clubs 
     g2.setColor(Color.RED); 
     g2.drawString("\u2665", (float) zeroAxis.x + 3, (float) zeroAxis.y - 3);//hearts 
     g2.drawString("\u2666", (float) zeroAxis.x - 18, (float) zeroAxis.y + 19);//diamonds 
     g2.setColor(Color.BLACK); 
    } 

    private void drawCardValues(Graphics2D g2) { 
     Double zeroAxis = new Point.Double((sizeX/2.0) - 8, 21); 
     float xx = (float) zeroAxis.x; 
     float yy = (float) zeroAxis.y; 
     g2.setFont(new Font("Arial", Font.BOLD, 24)); 
     String[] letters = {"A", "K", "Q", "J", "T", "9", "8", "7", "6", "5", "4", "3", "2"}; 
     float[] xPosition = {0, 25, 46, 63, 58, 42, 15, -10, -37, -53, -58, -46, -25}; 
     float[] yPosition = {0, 7, 23, 50, 80, 102, 115, 115, 102, 80, 50, 23, 7}; 
     for (int i = 0; i < 13; i++) { 
      g2.drawString(letters[i], xx + xPosition[i], yy + yPosition[i]); 
     } 
    } 

    private void drawClosingX(Graphics2D g2) { 
     Double zeroAxis = new Point.Double(sizeX/2.0, sizeY/2.0); 
     g2.draw(new Line2D.Double(zeroAxis.x - 5, zeroAxis.y - 5, zeroAxis.x + 5, zeroAxis.y + 5)); 
     g2.draw(new Line2D.Double(zeroAxis.x - 5, zeroAxis.y + 5, zeroAxis.x + 5, zeroAxis.y - 5)); 
    } 

    private void initComponents() { 
     this.addMouseListener(this); 
     this.setBounds(x - (sizeX/2), y - (sizeY/2), sizeX + 1, sizeX + 1); 
     this.setUndecorated(true); 
     this.setModal(true); 
     this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

     this.setVisible(true); 
    } 

    public void mouseClicked(MouseEvent e) { 
     this.dispose(); 
    } 

    public void mousePressed(MouseEvent e) { 
    } 

    public void mouseReleased(MouseEvent e) { 
    } 

    public void mouseEntered(MouseEvent e) { 
    } 

    public void mouseExited(MouseEvent e) { 
    } 
} 

PS。我扩展了JDialog,因为我无法让JPanel显示出来......

+0

不要发布另一个问题作为你自己的问题的答案。用任何新信息编辑现有问题或发表评论。 – 2011-05-18 23:35:45

+0

我编辑了这个问题。谢谢m8 ... – 2011-05-19 08:55:35

+0

'PS。我扩展了JDialog,因为我无法让JPanel显示出来......' - 不好,因为你失去了Swing图形的所有好处,你冒着不必要的副作用,并且不应该直接在顶层窗口上绘制。而是按照已经建议的方式在JPanel或JComponent中进行绘图,然后尝试弄清楚为什么JPanel没有显示出来。 – 2011-05-22 17:43:32