2011-05-13 257 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